pthread_mutex没有足够快地更新,因此一个线程“占用”了锁。

时间:2013-04-22 01:23:11

标签: pthreads mutex shared

我有一个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.

1 个答案:

答案 0 :(得分:2)

您可以查看sleep() / pthread_yield(),而不是sched_yield(),这会导致线程A在释放后立即再次获取互斥锁之前产生CPU。互斥体不排队,也不保证公平。

或者,使用条件变量发信号通知其他线程。