如何在 Linux 上为 C 和 C++ 创建线程安全库?

How to create thread safe lib for C and C++ on Linux?

我想在 C++11 中编写一些库,这些库将在 C 和 C++ 程序中使用(因此所有导出的函数都将标记为 extern "C")。

我希望所有导出的函数都是线程安全的。所以如果我要在 windows 上编写这个库,我可以使用临界区对象,但是我应该在 Linux 上使用什么?

这是我的选择:

  1. POSIX 互斥量
  2. C++11std::mutex
  3. C++11 原子变量
  4. Linux (POSIX) 信号量

麻烦: 无法保证将在使用我的库的代码中使用哪个线程 - POSIX 或 C++11。

因此无法使用 1) 和 2) 选项,因为 POSIX 线程 != C++11 线程。

Rest 选项看起来比基于互斥锁的解决方案慢得多。

有人知道在 Linux 上创建线程安全库的正确方法吗?

您标题中的问题似乎与您在 body 中关注的问题不同。如果你想编写线程安全的代码,除了遵循一些指导原则,即在访问全局变量时使用自由裁量权以及在访问线程共享的全局变量和/或变量时使用某种保护形式之外,没有真正的答案。

你好像真的在问如何编写可移植的多线程代码。说 C++11 不是 POSIX 线程,从基于 Linux 的机器的角度来看是不准确的。 std::thread的目的是为系统的底层线程库提供一个抽象层。在 Linux 上使用 std::thread 的情况下,您最终将进行 pthread 调用。作为测试,尝试在不链接到 libpthread (-lpthread) 的情况下使用 C++ 线程编译程序,您应该会看到它失败。

如果您的库是线程安全的,您应该确保当用户从不同线程调用您的库函数时不会发生不安全的操作。当然,不要求用户至少使用一些自由裁量权是愚蠢的 him/herself,例如不从多个线程同时调用同一对象上的修改函数。

最后,线程安全归结为使用互斥锁之类的东西来保护您的内部状态。因为它是内部状态,所以用户在你的库之外做什么并不重要,因此你使用哪个底层库来提供这种同步也无关紧要。当您使用 C++11 编写库时,我建议您使用其提供的线程原语(如果它们满足您的需要)。