libbpf_print_fn_t libbpf_set_print(libbpf_print_fn_t fn)
 {
-       libbpf_print_fn_t old_print_fn = __libbpf_pr;
+       libbpf_print_fn_t old_print_fn;
+
+       old_print_fn = __atomic_exchange_n(&__libbpf_pr, fn, __ATOMIC_RELAXED);
 
-       __libbpf_pr = fn;
        return old_print_fn;
 }
 
 {
        va_list args;
        int old_errno;
+       libbpf_print_fn_t print_fn;
 
-       if (!__libbpf_pr)
+       print_fn = __atomic_load_n(&__libbpf_pr, __ATOMIC_RELAXED);
+       if (!print_fn)
                return;
 
        old_errno = errno;
 
  * be used for libbpf warnings and informational messages.
  * @param fn The log print function. If NULL, libbpf won't print anything.
  * @return Pointer to old print function.
+ *
+ * This function is thread-safe.
  */
 LIBBPF_API libbpf_print_fn_t libbpf_set_print(libbpf_print_fn_t fn);