假设我有三个线程,它们都通过互斥体访问相同的互斥部分。
让我给你举这个例子。
第一个线程探测互斥体并首先获取其所有权:
//THREAD 1
//TIME: 2013-03-13 01:00:00.000Z
WaitForSingleObject(hMutex, INFINITE);
//Performs the operation that lasts 50 ms
ReleaseMutex(hMutex);
然后 10 毫秒后,线程 2 也请求它:
//THREAD 2
//TIME: 2013-03-13 01:00:00.010Z
WaitForSingleObject(hMutex, INFINITE);
//Do work
ReleaseMutex(hMutex);
20 毫秒后,线程 3 也请求它:
//THREAD 3
//TIME: 2013-03-13 01:00:00.030Z
WaitForSingleObject(hMutex, INFINITE);
//Do work
ReleaseMutex(hMutex);
在这种情况下,我能否确定线程 2 始终会在线程 3 之前获得互斥锁所有权(因为可以这么说,因为它是“第一行”),或者谁获得线程 2 和 3 之间的所有权是完全任意的吗?
如果互斥体是任意的,如何确保第一个等待线程首先获得所有权?
可以肯定地说,出于您的目的,它是任意的,因为操作系统将唤醒等待互斥锁的线程之一并将其授予该线程,但关于哪个线程的决定是不确定的。
您可以使用全局优先级索引来实现您自己的线程之间的优先级方案。然后,如果等待互斥体的线程之一在没有被调用的情况下接收到它排在第一位它立即放弃它并继续等待,直到互斥体再次可用。这应该重复,直到获取互斥体并且线程被排在第一位根据线程的优先级索引与全局索引相比。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)