我在下面的线程(bool allow)中有全局变量,它限制客户端等待(通过赋值allow = false)直到它完成。完成后允许= true
bool allow =true;
static void * mythread(void *arg)
{
/* here is Lock mutex code */
allow =false;(**non atomic**)
system(command);
allow =true;
/* here is Unlock Mutex code */
}
if(allow)
{
// validate thread output
}
else
{
// wait
}
我关心的是我应该使用std :: atomic作为全局变量还是bak
std::atomic<bool>allow(true);
static void * mythread(void *arg)
{
/* here is Lock mutex code */
allow.store(false, std::memory_order_seq_cst);
system(command);
allow.store(true, std::memory_order_seq_cst);
/* here is Unlock Mutex code */
}
if(allow)
{
// validate thread output
}
else
{
// wait
}
答案 0 :(得分:4)
如果对布尔值的所有访问都受到互斥锁的保护,则无论哪种方式都无关紧要(就正确性而言)。使用atomic<>
或不使用。代码的正确性不会受到影响。
但性能可能会受到影响,除了您锁定对已有mutex
保护它的内容的访问权限之外,std::atomic<>
有可能使用引擎盖下的mutex
。但是,std::atomic_flag
保证无锁。有关详情,请参阅the cppreference documentation。
如果您有一个线程访问该布尔值,那么根本没有任何同步点。