【发布时间】:2016-02-09 00:24:07
【问题描述】:
所以我有两个线程,它们共享同一个变量“计数器”。我想通过仅在两个线程都达到该点后继续执行来同步我的线程。不幸的是,我进入了死锁状态,因为我的线程没有改变它的检查变量。我的方法是:
volatile int counter = 0;
Thread() {
- some calculations -
counter++;
while(counter != 2) {
std::this_thread::yield();
}
counter = 0;
- rest of the calculations -
}
这个想法是,由于我有 2 个线程,一旦它们到达那个点 - 在不同的时间 - 它们将增加计数器。如果计数器不等于 2,那么首先到达那里的线程将不得不等待,直到另一个线程增加了计数器,以便它们同步。有谁知道问题出在哪里?
为了添加有关该问题的更多信息,我有两个线程在数组上执行一半的操作。一旦他们完成,我想确保他们都完成了他们的计算。一旦它们是,我可以通知打印机线程唤醒并执行它的打印和清除阵列的操作。如果我在两个线程完成之前这样做,就会出现问题。
伪代码:
Thread() {
getLock()
1/2 of the calculations on array
releaseLock()
wait for both to finish - this is the issue
wake up printer thread
}
【问题讨论】:
-
通常当我们谈论线程同步时,我们谈论的是强制线程一个接一个地按顺序运行,而不是at同一时间。你似乎试图做相反的事情。你能解释一下为什么你想让你的线程同时运行吗?顺便说一句,无法确定您的线程是否会同时运行,这取决于操作系统调度程序。
-
所以本质上我正在对一个数组执行计算,该数组在两个线程之间拆分。最后,我想使用另一个线程打印和清除这个数组。我需要一个线程来唤醒打印线程,但我需要两个线程都在阵列上完成它们的执行,然后才能唤醒打印机线程。如果它们不同步,我会得到一个未完成的数组。
-
volatile 在多线程中没有地位
标签: c++ multithreading synchronization atomic stdatomic