说,如果我有三个线程都通过互斥锁访问相同的互斥部分.
让我给你这个例子.
第一个线程探测互斥锁并首先获取其所有权:
//THREAD 1
//TIME: 2013-03-13 01:00:00.000Z
WaitForSingleObject(hMutex, INFINITE);
//Performs the operation that lasts 50 ms
ReleaseMutex(hMutex);
然后10 ms之后,线程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之间获得所有权是完全任意的?
如果互斥量是任意的,如何确保第一个等待线程首先获得所有权?
解决方法:
可以肯定地说,就您的目的而言,在操作系统将唤醒等待Mutex的线程之一并将其授予该线程的意义上,它是任意的,但是决定哪个线程是不确定的.
您可以使用全局优先级索引为线程之间的优先级实现自己的方案.然后,如果等待Mutex的线程中的一个在没有进入第一个队列的情况下收到它,它将立即放弃并继续等待直到Mutex再次可用.这应该重复进行,直到获取Mutex为止,并且根据线程的优先级索引(与全局索引相比),线程处于线程内.