如何在C++中使函数线程安全?

cod*_*ons 16 c++ multithreading

假设我有一个包含5个子线程的线程池.他们正在调用一个名为"functionA()"的函数.如何使函数成为线程安全的?

如果同时调用这5个线程,那么它们是否同时执行?或者他们等到当前在函数中工作的线程完成?

提前致谢..

Ric*_*ton 17

如果函数不修改非本地内存并且它不调用任何函数,则该函数已经是线程安全的.在这个(微不足道的)情况下,你不需要做任何事情.

你真的想要考虑保护数据,而不是功能.例如,假设该函数修改了非本地数据结构X.提供一个互斥锁来保护X并在每次访问之前将其锁定并在之后解锁.您可能有多个访问X的函数(例如insertX(),deleteX(),...).只要您保护数据,您就可以了.


Vin*_*ura 5

使用互斥锁就可以做到这一点。

任何一个:

mutex_lock(&mutex);
functionA();
mutex_unlock(&mutex);
Run Code Online (Sandbox Code Playgroud)

或者在 functionA() 内部;

int functionA() {
mutex_lock(&mutex);
// code
mutex_unlock(&mutex);
}
Run Code Online (Sandbox Code Playgroud)

小心第二个解决方案,因为如果函数有其他退出路径(例如中间的返回)并且互斥体未解锁,则会出现称为死锁的情况。

  • 这就是为什么无论函数如何结束都使用 RAII 防护来调用解锁的原因。(顺便说一句,第一个版本同样被破坏,如果出现异常,互斥体将被泄漏)。 (8认同)