Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用原子布尔保护进程_C++_Multithreading_If Statement_Boolean_Atomic - Fatal编程技术网

C++ 用原子布尔保护进程

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

请假设一个具有以下代码段的mulithreaded函数:

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;
}