有没有办法确保被阻塞的线程以被阻止的顺序被唤醒?我在某处读到这将被称为"强锁",但我没有找到任何资源.
在Mac OS X上,可以设计一个FIFO队列来存储被阻塞线程的所有线程ID,然后使用nifty函数pthread_cond_signal_thread_np()唤醒一个特定线程 - 这显然是非标准和非可移植的.
我能想到的一种方法是使用一个类似的队列,并在unlock()此时向broadcast()所有线程发送一个并让它们检查哪一个是下一个.
但这会产生很多开销.
解决问题的方法是将packaged_task发送到队列并让它按顺序处理它们.但对我而言,这似乎更像是一种解决方案而非解决方案.
编辑:
正如评论所指出的,这个问题可能听起来无关紧要,因为原则上没有保证锁定尝试的顺序.
作为澄清:
我有一些我称之为ConditionLockQueue的东西,它与Cocoa库中的NSConditionLock类非常相似,但是它维护了一个被阻塞的线程的FIFO队列而不是一个或多或少的随机池.
基本上任何线程都可以"排队"(有或没有特定'条件'的要求 - 一个简单的整数值 - 要满足).然后将该线程放在队列上并阻塞,直到它成为满足条件的队列中最前面的元素.
这提供了一种非常灵活的同步方式,我发现它在我的程序中非常有用.
现在我真正需要的是一种唤醒具有特定id的特定线程的方法.
但这些问题几乎是相似的.
这个:
http://msdn.microsoft.com/en-us/library/ms686915(VS.85).aspx
似乎没有暗示.
我有三个进程通过管道进行通信.进程A创建一个事件,进程B&C每个都使用WaitForSingleObject(在第二个线程中).
所以现在我们有-TWO-每个进程等待-SINGLE-事件.
进程A使用SetEvent()触发事件,进程B响应,进程C不响应.
结论:
每个WaitForSingleObject()都需要一个唯一的事件......正确吗?
比方说,如果我有三个线程都通过互斥锁访问相同的互斥部分.
让我举个例子.
第一个线程探测互斥锁并首先获得其所有权:
//THREAD 1
//TIME: 2013-03-13 01:00:00.000Z
WaitForSingleObject(hMutex, INFINITE);
//Performs the operation that lasts 50 ms
ReleaseMutex(hMutex);
Run Code Online (Sandbox Code Playgroud)
然后10毫秒后,线程2也请求它:
//THREAD 2
//TIME: 2013-03-13 01:00:00.010Z
WaitForSingleObject(hMutex, INFINITE);
//Do work
ReleaseMutex(hMutex);
Run Code Online (Sandbox Code Playgroud)
20毫秒后,线程3也请求它:
//THREAD 3
//TIME: 2013-03-13 01:00:00.030Z
WaitForSingleObject(hMutex, INFINITE);
//Do work
ReleaseMutex(hMutex);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我可以确定线程2将始终在线程3之前获得互斥锁所有权(因为它可以说是"排在第一位"),或者它是否完全随意获得线程2和3之间的所有权?
如果它与互斥锁是任意的,如何确保第一个等待的线程首先获得所有权?