我在下面的线程(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 还是像上面那样好
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
}
最佳答案
如果对 bool 值的所有访问都受互斥锁保护,那么这两种方式都没有关系(就正确性而言)。使用 atomic<>
或者不要。您的代码的正确性不会受到影响。
但性能可能会受到影响,除了您正在锁定对已经具有 mutex
的内容的访问之外。保护它,std::atomic<>
有可能使用mutex
在引擎盖下。 std::atomic_flag
但是,保证是无锁的。参见 the cppreference documentation更多。
如果您有一个线程访问该 bool 值,那么根本没有任何同步的意义。
关于c++ - std::atomic bool 或 Normal global bool 在单线程中好用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44969335/