我有一个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.
答案 0 :(得分:2)
您可以查看sleep()
/ pthread_yield()
,而不是sched_yield()
,这会导致线程A在释放后立即再次获取互斥锁之前产生CPU。互斥体不排队,也不保证公平。
或者,使用条件变量发信号通知其他线程。