Qt:QReadWriteLock是否如图所示工作?

时间:2010-12-14 18:51:41

标签: c++ multithreading qt mutex sleep

我有四个线程需要同步。为了实现这一点,我希望每个线程传递相同的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

3 个答案:

答案 0 :(得分:3)

没有QReadWriteLock没有完全按照你想要的方式做,在阅读上面的评论之后,你真的不需要任何锁定来写入数据,你只需要确保读数在你的阵列上是无关紧要的。如果你需要线程同时运行,为什么不倒计数锁存?这可以确保所有线程(可能)同时启动。

答案 1 :(得分:2)

我不知道你的“同时运行”的余量是多少,但是线程不能同时运行,很难预测偏移量是多少。您尝试实现的是threading barrier,应该使用条件变量(QWaitCondition)来完成,但即使这样也不能保证同时启动,只是它们不会在所有条件变量之前启动已经完成了以前的工作(但是你的余量可以很大)。

答案 2 :(得分:1)

我认为这里的要求是这样的:

// each thread intends to do this
doStep1();
makeSureEveryOtherThreadHasDoneStep1();
doStep2();

我还假设所有doStep2() s“是否同时运行”并不重要,只要每个doStep2()运行 all doStep1()已完成。

从这两个假设看,问题中发布的代码看起来是正确的,但是使用繁忙的等待。更好的解决方案是将QWaitConditionQMutex一起使用。类似的东西:

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。