使用原子bool保护过程

时间:2014-05-12 21:55:44

标签: c++ multithreading if-statement boolean atomic

请使用此部分代码假设多线程函数:

if( !executing_singular_process ){
    executing_singular_process = true;
    singular_process();
}
executing_singular_process = false;

其中executing_singular_processstd::atomic<bool>

是否存在一个线程在if( !executing_singular_process )if( !executing_singular_process )之间的另一个线程中的精确时刻执行executing_singular_process = true;的可能性?

如果是这样,如何使用原子bool来确保一个进程只能由一个线程执行?

2 个答案:

答案 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同时执行你的单一过程。