并发读写

时间:2017-05-25 06:36:33

标签: multithreading memory mutex read-write

下面是我的代码,其中两个变量在回调时更新,每50ms调用一次。还有一个读取器线程,每50ms唤醒一次并读取变量。

在经过this之后,我猜测会有一些实例,当读取的线程在收到回调时醒来,并且因为我在读取和写入时没有锁定相同的互斥锁,如果它将导致读取不一致的内存。

然而,当我运行它时,这种情况永远不会发生。难道我没有运行足够长的时间或者我的理解是否有任何错误?

recursive_mutex mutex1
recursive_mutex mutex2
var1, var2

//called every 50ms
onUpdateListener() {
    lock(mutex1)
    update var1
    update var2
}

VarReaderThread::readVar() {
    sleep(50)
    while(true) {
        {
        lock(mutex2)
        read var1
        read var2
        sleep(50)
        }
   }
}

1 个答案:

答案 0 :(得分:0)

当两个或多个线程访问共享数据时发生数据争用,其中至少有一个是一个写操作,其中一个或多个线程可能遇到不一致状态。

提供的代码有两个互斥量,一个用于读取,另一个用于写入。 这绝不会排除线程读取共享数据(示例中为var1var2)而另一个正在写入它们,或者更确切地说是在一个线程开始写入其中一个之后并且在完成之前在中间状态被认为是代码逻辑及其目的的参数内的不一致状态的情况下写入另一个。

需要一个mutex来使读写独占。 另外,还不清楚为什么声明递归互斥锁。只有当给定的线程可能遇到要求它获取已经拥有的互斥锁的代码时,才需要这样做。在可能的情况下设计和编码这种情况是更好的设计。

已经引入了明确的unlock步骤,根据编码模型可能需要也可能不需要(C中需要,在C ++中使用std::lock_guardsynchronized或{{1}在Java等中。)。

已经引入了一些条件来指示正确的终止条件。 finally是不好的做法,除非其他条件会优雅地终止它。

更复杂的模型可能会使用共享互斥锁'其中多个线程可以将其保存在“读取”中。模式,但只有一个,如果一个人持有'写'模式。这可能需要也可能不需要一些信号来确保“写入”。并没有进入一个活锁,许多读者无休止地阻止'写'访问。

while(true)