【发布时间】:2021-09-20 00:49:33
【问题描述】:
我最近遇到了一些运行良好的代码,其中 static bool 在多个线程(单个写入器,多个接收器)之间共享,尽管没有同步。
类似的东西(简化):
//header A
struct A {
static bool f;
static bool isF() { return f; }
};
//Source A
bool A::f = false;
void threadWriter(){
/* Do something */
A::f = true;
}
// Source B
void threadReader(){
while (!A::isF()) { /* Do something */}
}
对我来说,这种代码有一个竞争条件,即使 bool 上的操作是原子的(在大多数 CPU 上),我们不能保证来自写入线程的写入对读取线程是可见的。但有些人告诉我,f 是static 会有所帮助。
那么,C++11 中有什么东西可以使这段代码安全吗?或者任何与静态相关的东西可以使这段代码工作?
【问题讨论】:
-
不,这段代码会导致 UB。
-
std::atomic
?此外,即使您的 bool 是原子的,调用 isF() 来读取它也可能不是。 -
这是一种老派的态度,可能并不准确,但我一直坚信,如果它需要线程安全,就需要互斥体。我会关注是否有人发布更好的答案。
-
@JosephLarson --
std::atomic<T>在单个对象上提供线程安全操作。如果这足够了,就不需要互斥体,而且原子操作可能会更快。 -
其实我不太明白这个问题。是不是“这段代码有异味,但它有效。为什么?”还是“这段代码有异味,如何解决?”
标签: c++ multithreading c++11