gpt4 book ai didi

c++ - 我可以在多线程情况下使用不带锁的char变量吗

转载 作者:行者123 更新时间:2023-12-04 00:50:24 25 4
gpt4 key购买 nike

正如c/c++标准所说,char的大小必须是1。据我了解,这意味着 CPU 保证对 char 的任何读取或写入都必须在一条指令中完成。

假设我们有很多线程,它们共享一个 char 变量:

char target = 1;

// thread a
target = 0;

// thread b
target = 1;

// thread 1
while (target == 1) {
// do something
}

// thread 2
while (target == 1) {
// do something
}

总而言之,线程有两种:一种是将target置为01,另一种是如果 target == 1,则执行一些任务。目标是我们可以通过修改 target 的值来控制任务线程。

据我了解,我们似乎根本不需要使用mutex/lock。但是我的编码经验让我强烈地感觉到,在这种情况下我们必须使用 mutex/lock

我现在很困惑。在这种情况下,我应该使用 mutex/lock 吗?

你看,我能理解为什么我们在其他情况下需要mutex/lock,比如i++。因为 i++ 不能只用一条指令完成。那么 target = 0 是否可以在一条指令中完成,对吧?如果是这样,是否意味着在这种情况下我们不需要 mutex/lock

好吧,我知道我们可以使用 std::atomic,所以我的问题是:既不使用 mutex/lcok 也不使用 std 是否可以::原子

最佳答案

std::atomic保证访问变量是原子的。来自 cppreference :

Each instantiation and full specialization of the std::atomic templatedefines an atomic type. If one thread writes to an atomic object whileanother thread reads from it, the behavior is well-defined (see memorymodel for details on data races).

char实际上是原子的(大小为 1,是不够的),那么 std::atomic<char>不需要额外的同步。但是,在 char 的平台上不是原子的,std::atomic<char>保证它可以通过使用互斥锁或类似的方式以原子方式读取和写入。

在实践中,我期望 char是原子的,但标准并不能保证这一点。

还要考虑像 += 这样的操作读取 写入值,因此单独的原子读取和写入不足以安全地调用 += , 而 std::atomic<T>有一个合适的operator+= .

长话短说

I'm confused now. Should I use mutex/lock or not in this case?

让其他人为您做决定。当你想要原子的东西时,使用 std::atomic<something>除非你想对同步进行细粒度控制。

关于c++ - 我可以在多线程情况下使用不带锁的char变量吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67019677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com