我有四个线程需要同步。为了实现这一点,我希望将每个线程传递给相同的布尔数组。每个线程一旦到达线程中的某个点,就会将“相应”值更改为true,然后不断检查其余值是否为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满足我们的需求。

最佳答案

否,QReadWriteLock并没有完全按照您想要的做,在阅读完上面的注释后,您实际上不需要任何锁来写入数据,只需要确保读取在数组上是可循环的即可。如果您需要线程同时运行,为什么不倒数闩锁呢?这样可以确保所有线程(可能)同时启动。

10-04 14:26