c-互斥体所有权队列顺序

说,如果我有三个线程都通过互斥锁访问相同的互斥部分.

让我给你这个例子.

第一个线程探测互斥锁并首先获取其所有权:

//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为止,并且根据线程的优先级索引(与全局索引相比),线程处于线程内.

上一篇:Linux上的pthread条件变量,异常行为


下一篇:java – 无法使用Thread同步进程