std :: atomic bool或Normal global bool在单线程中表现好吗?

时间:2017-07-07 11:11:31

标签: c++ multithreading c++11 stdatomic

我在下面的线程(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
}

1 个答案:

答案 0 :(得分:4)

如果对布尔值的所有访问都受到互斥锁的保护,则无论哪种方式都无关紧要(就正确性而言)。使用atomic<>或不使用。代码的正确性不会受到影响。

性能可能会受到影响,除了您锁定对已有mutex保护它的内容的访问权限之外,std::atomic<>有可能使用引擎盖下的mutex。但是,std::atomic_flag保证无锁。有关详情,请参阅the cppreference documentation

如果您有一个线程访问该布尔值,那么根本没有任何同步点。