0

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

1 回答 1

2

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

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

于 2013-04-23T21:11:23.633 回答