c++ - std::atomic bool 或 Normal global bool 在单线程中好用吗?

标签 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 还是像上面那样好

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/

相关文章:

multithreading - 如何同步 `vkMapMemory` ?

c++ - 测量 CUDA 分配时间

c++ - 为什么更改 std::vector 的分配器时初始化列表不可用?

c++ - SetLayeredWindowAttributes 使窗口透明仅在部分时间有效

c++ 正在释放的指针未分配

c++ - 使指针为 NULL 会释放内存吗?

c++ - 使用 moveToThread 时是否需要锁定

java - Lambda 表达式可以解决死锁吗?

c++ - 如何在编译时提取没有路径和后缀的源文件名?

c++ - 如何将参数传递给 std::vector::insert()?