std::atomic bool or Normal global bool 在单线程中好用吗?
std::atomic bool or Normal global bool is good in single thread?
我在下面的线程(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
}
如果对布尔值的所有访问都受互斥量保护,那么这两种方式都没有关系(就正确性而言)。使用 atomic<>
或不使用。您的代码的正确性不会受到影响。
但是 性能可能会受到影响 ,除了您正在锁定对已经有 mutex
保护的东西的访问之外,std::atomic<>
有在引擎盖下使用 mutex
的潜力。 std::atomic_flag
然而,保证是无锁的。有关更多信息,请参阅 the cppreference documentation。
如果您有一个线程访问该布尔值,那么根本没有任何同步意义。
我在下面的线程(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
}
如果对布尔值的所有访问都受互斥量保护,那么这两种方式都没有关系(就正确性而言)。使用 atomic<>
或不使用。您的代码的正确性不会受到影响。
但是 性能可能会受到影响 ,除了您正在锁定对已经有 mutex
保护的东西的访问之外,std::atomic<>
有在引擎盖下使用 mutex
的潜力。 std::atomic_flag
然而,保证是无锁的。有关更多信息,请参阅 the cppreference documentation。
如果您有一个线程访问该布尔值,那么根本没有任何同步意义。