【发布时间】:2022-01-07 05:45:35
【问题描述】:
我有两个线程和一个 CPU。
我希望在其程序中较早到达 A 行的两个线程中的每一个都等待另一个线程到达 A 行,之后两个线程继续运行它们的程序。我已经这样做了,但是我希望 A 行的两个线程同时运行它们的程序。
我怎样才能做到这一点?
我的代码:
//headers
static volatile bool waitFlag[2];
void *threadZero(void*){
//some codes
waitFlag[1] = true;
while(!waitFlag[0]);
//line A of thread zero
//some codes
}
void *threadOne(void*){
// some codes
waitFlag[0] = true;
while(!waitFlag[1]);
//line A of thread one
//some codes
}
int main(){
waitFlag[0] = waitFlag[1] = false;
//Creates two threads and waits for them to finish.
}
【问题讨论】:
-
所以请注意,仅使用普通的
bool不是线程安全的,并且会导致数据竞争,从而导致未定义的行为。在 C 中,您应该使用 OS 原语或 C11 atomics(通常受支持) -
Re "OS 原语",这是指互斥体、信号量等。如果涉及到非平凡的等待,这些比使用忙等待循环更合适原子。
-
@mehran 因为
bool不是线程安全的,CPU 可能看不到跨线程的更新。 C 标准明确规定,为了不引起数据竞争,它要么需要在屏障(OS Primitive)后面,要么在从多个线程访问时使用原子。 -
如果您愿意切换到 C++20,
std::latch将这一切都包装在一个不错的包中。请注意,它仍然不能确保两个线程实际上同时运行;这总是受操作系统调度程序的支配。
标签: c multithreading