请使用此部分代码假设多线程函数:
if( !executing_singular_process ){
executing_singular_process = true;
singular_process();
}
executing_singular_process = false;
其中executing_singular_process
是std::atomic<bool>
。
是否存在一个线程在if( !executing_singular_process )
和if( !executing_singular_process )
之间的另一个线程中的精确时刻执行executing_singular_process = true;
的可能性?
如果是这样,如何使用原子bool来确保一个进程只能由一个线程执行?
答案 0 :(得分:6)
是的,两个线程可能同时执行函数singular_process()
。您可以使用compare_exchange来避免此问题:
bool expected = false;
if (executing_singular_process.compare_exchange_strong(expected, true)) {
singular_process();
executing_singular_process = false;
}
答案 1 :(得分:1)
除了在nosid的答案中指出的,你的代码还有另一个巨大的问题,即使没有你自己基本上发现的安全漏洞(它也在nosids答案中修复)
假设您的代码中有3个线程运行:
线程A获取原子bool,将其设置为true,执行单个进程。 现在线程B到达,发现一个真实的。线程跳过singular_process,但现在将你的原子bool设置为true!但是线程A可能仍然在进行单一过程! 所以当现在线程C到达初始检查时,你的bool告诉你,执行奇异进程是完全可以的。突然A和C同时执行你的单一过程。