C++ 用原子布尔保护进程
请假设一个具有以下代码段的mulithreaded函数:C++ 用原子布尔保护进程,c++,multithreading,if-statement,boolean,atomic,C++,Multithreading,If Statement,Boolean,Atomic,请假设一个具有以下代码段的mulithreaded函数: if( !executing_singular_process ){ executing_singular_process = true; singular_process(); } executing_singular_process = false; 其中执行_singular_进程是一个std::atomic 在if(!executing_singular_process)和executing_singular_p
if( !executing_singular_process ){
executing_singular_process = true;
singular_process();
}
executing_singular_process = false;
其中执行_singular_进程
是一个std::atomic
在if(!executing_singular_process)
和executing_singular_process=true之间的另一个线程中,是否存在一个线程在另一个线程的精确时刻执行if(!executing_singular_process)
的可能性代码>
如果是这样,如何使用原子bool来确保一个进程只能由一个线程执行?是的,两个线程可能同时执行函数singular\u process()
。您可以通过以下方法避免此问题:
是的,两个线程同时执行函数single_uprocess()
。您可以通过以下方法避免此问题:
除了nosid的答案中指出的问题外,您的代码还有另一个巨大的问题,即使没有您基本上发现的安全漏洞(它在nosid的答案中也已修复)
假设有3个线程在代码上运行:
线程A到达原子布尔值,将其设置为true,执行单个进程。
现在线程B到达,找到一个true。线程跳过单数_过程,但现在将原子布尔设置为true!但线程A可能仍在处理单个进程!
所以当线程C到达初始检查时,bool会告诉它,完全可以执行单一进程。突然,A和C同时执行你的单一进程。除了nosid的答案中指出的问题外,你的代码还有另一个巨大的问题,即使没有你基本上发现的安全漏洞(nosid的答案中也修复了这个问题)
假设有3个线程在代码上运行:
线程A到达原子布尔值,将其设置为true,执行单个进程。
现在线程B到达,找到一个true。线程跳过单数_过程,但现在将原子布尔设置为true!但线程A可能仍在处理单个进程!
所以当线程C到达初始检查时,bool会告诉它,完全可以执行单一进程。突然A和C同时执行你的单数过程。完全同意。类似TSL(测试和设置锁定)的例程是实现这一点的唯一方法。+1因为听起来不错:-)我不知道原子设施,也没有时间检查,但我认为我正在学习这个答案。完全同意。类似TSL(测试和设置锁定)的例程是实现这一点的唯一方法。+1因为听起来不错:-)我不知道原子设施,也没有时间检查,但我想我正在学习这个答案。
bool expected = false;
if (executing_singular_process.compare_exchange_strong(expected, true)) {
singular_process();
executing_singular_process = false;
}