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

标签 c++ linux multithreading c++11 posix

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

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

这是我的选择:

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

问题: 无法保证将在使用我的库的代码中使用哪个线程(POSIX 或 C++11)。

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

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

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

最佳答案

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

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

关于c++ - 如何在 Linux 上为 C 和 C++ 创建线程安全库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43642740/

相关文章:

c++ - 在 C++11 中获取函数指针的语法

c++ - 如何使用 C/C++ 获取数字锁定状态?

c - 如何在终端上滚动消息?

linux - 当 “vagrant up” 时,它表示 “It appears your machine doesn' t 支持 NFS”(Debian jessie)

c++ - 使用多线程时 Qt Creator 崩溃

C++ Nvidia Cg问题

C++ 和 Eclipse 项目 - 如何计算出要包含的 header 以及要转发声明的类

linux - 如果 `pwd -P` 包含包含空格的文件夹名称,bash 脚本将失败

swift - NSOperationQueue 没有完成操作?

c# - Thread 类中 Thread.BeginThreadAffinity() 方法的用途是什么?