使用混合C和C++进行线程同步

few*_*ewu 4 c c++ multithreading thread-synchronization

我有一个多线程程序,主线程是第三方(无法更改)和纯C.我的任务是围绕它构建新模块(在C++中),那些部分驻留在其他线程中,需要使用C程序的界面.基本上只是读取在C线程中存储和更新的一些变量(整数,浮点数,没有复杂).

现在我的问题是:我如何确保在访问这些变量时不会从C接口中获取垃圾,因为在读取时我无法使用互斥锁将其锁定.这甚至可能吗?或者正在编写一个float/int原子操作?

Bee*_*ope 5

不幸的是,在C或C++中,"写一个浮点数/ int [是]一个原子操作"这样的语句没有很好地定义(尽管使用std::atomicC++ 11和C11的stdatomic.h方法可以帮助 -但这对你无法修改的库的C语言互操作没有帮助,所以你可以在这里忽略它.

您可以在特定编译器和平台上找到有关这些问题的指导 - 例如,您可能会发现在大多数平台上,对齐的32位或64位读取或写入将是原子的,如果对齐,并且大多数编译器将对齐适当的.

然而,走这条路是疯狂的.如果涉及多个线程,只需使用POSIX/pthreads功能,例如pthreads互斥体 - 可以从C和C++轻松访问,以保护对跨线程共享的状态的任何访问.

由于您无法修改C代码,因此在调用C库之前,可能必须在C++代码中进行所有锁定.如果您可以阅读但不修改C代码,或者文档非常清楚线程/共享模型,您可以使用细粒度锁定策略,但是如果没有任何分析表明存在瓶颈,我' d从一个全局锁开始,用于保护对C API的每次访问.

  • 如果写入是不同步的,则只读取锁定是没有意义的. (2认同)
  • c11也有原子.stdatomic.h (2认同)
  • 我从不建议只锁定读取.我建议锁定对C库的任何调用,这将包含所有读取和写入(由本机库).如果存在任何实际的共享状态(例如,共享库公开的全局变量),则在访问它时需要在C++端进行锁定. (2认同)