我有四个线程需要同步。为了实现这一点,我希望每个线程传递相同的bool数组。一旦线程到达线程中的某个点,每个线程都会将“对应”值更改为true,然后不断检查其余值是否为真。如果是,请输入循环...示例
//above thread init stuff
oLock->lockForWrite();
abSync[iThreadNum] = true; //iThreadNum = {0...3} depending on whats set
oLock->unlock();
bool bSynced = false;
while (!bSynced)
{
oLock->lockForRead();
if (abSync[0] && abSync[1] && abSync[2] && abSync[3])
bSynced = true;
oLock->unlock();
}
//below thread run and finish
QReadWriteLock是否如上所述工作?它实际上是否会锁定写入的变量(当每个线程通过时)而不是读取?文档中的quick look表明QReadWriteLock只会在lockForRead()
处阻塞,如果有写锁定但不是我想要的读锁定。
另外,我理解上面的内容会在循环中吸收CPU周期,这就是想要的行为。根据我们的需要,使用Sleep
不是good enough。
答案 0 :(得分:3)
没有QReadWriteLock没有完全按照你想要的方式做,在阅读上面的评论之后,你真的不需要任何锁定来写入数据,你只需要确保读数在你的阵列上是无关紧要的。如果你需要线程同时运行,为什么不倒计数锁存?这可以确保所有线程(可能)同时启动。
答案 1 :(得分:2)
我不知道你的“同时运行”的余量是多少,但是线程不能同时运行,很难预测偏移量是多少。您尝试实现的是threading barrier,应该使用条件变量(QWaitCondition)来完成,但即使这样也不能保证同时启动,只是它们不会在所有条件变量之前启动已经完成了以前的工作(但是你的余量可以很大)。
答案 2 :(得分:1)
我认为这里的要求是这样的:
// each thread intends to do this
doStep1();
makeSureEveryOtherThreadHasDoneStep1();
doStep2();
我还假设所有doStep2()
s“是否同时运行”并不重要,只要每个doStep2()
运行 all doStep1()
已完成。
从这两个假设看,问题中发布的代码看起来是正确的,但是使用繁忙的等待。更好的解决方案是将QWaitCondition
与QMutex
一起使用。类似的东西:
doStep1();
mutex->lock();
abSync[iThreadNum] = true;
if (abSync[0] && abSync[1] && abSync[2] && abSync[3]) {
waitCondition->wakeAll(); // yay! all are in sync
} else {
waitCondition->wait(mutex);
}
mutex->unlock();
doStep2();
已编辑:mutex->unlock()
从wakeAll()
之后移至doStep2()
之前的评论,感谢@stefaanv。