我有一个 c++ 程序,我在其中创建多个线程并让它们访问共享数组。
每次我想要一个线程访问数组时,我都会调用
pthread_mutex_lock(&mutex);
访问数组,然后调用
pthread_mutex_unlock(&mutex);
所有线程不断循环,直到它们访问数组一定次数。因此,他们不只是访问数组一次,而是多次访问它。
现在,当我按原样执行程序时,无论哪个线程首先获得互斥锁(通常是创建的第一个线程),都会执行直到它完成,然后才允许另一个线程访问数组。
如果我在后面添加一个简单的 sleep()
pthread_mutex_unlock(&mutex);
然后线程将交替访问数组(这是我想要的)。我宁愿不必使用 sleep() 来完成此操作。
据我所知,我相信这是正在发生的事情:
Thread A locks the mutex and begins accessing the array
Thread B tries to lock the mutex but finds its locked, therefore it waits
Thread A finishes with the array and unlocks the mutex
Thread A loops and relocks the mutex before Thread B realizes that Thread A unlocked the matrix
因此,线程 A 继续访问数组,直到它被访问 n 次,然后完成并且线程 B 访问数组 n 次
无论如何让线程等待(等待互斥锁解锁)更快地更新并在解锁后立即获取锁?
我希望上面的输出更像是:
Thread A locks the mutex and begins accessing the array
Thread B tries to lock the mutex but finds its locked, therefore it waits
Thread A finishes with the array and unlocks the mutex
Thread B sees the mutex is unlocked and locks it
Thread A loops and tries to lock the mutex, but finds its locked, therefore it waits
... etc.