相关疑难解决方法(0)

创建一个锁,以保留C++ 11中锁定尝试的顺序

有没有办法确保被阻塞的线程以被阻止的顺序被唤醒?我在某处读到这将被称为"强锁",但我没有找到任何资源.

在Mac OS X上,可以设计一个FIFO队列来存储被阻塞线程的所有线程ID,然后使用nifty函数pthread_cond_signal_thread_np()唤醒一个特定线程 - 这显然是非标准和非可移植的.

我能想到的一种方法是使用一个类似的队列,并在unlock()此时向broadcast()所有线程发送一个并让它们检查哪一个是下一个.
但这会产生很多开销.

解决问题的方法是将packaged_task发送到队列并让它按顺序处理它们.但对我而言,这似乎更像是一种解决方案而非解决方案.

编辑:
正如评论所指出的,这个问题可能听起来无关紧要,因为原则上没有保证锁定尝试的顺序.
作为澄清:

我有一些我称之为ConditionLockQueue的东西,它与Cocoa库中的NSConditionLock类非常相似,但是它维护了一个被阻塞的线程的FIFO队列而不是一个或多或少的随机池.

基本上任何线程都可以"排队"(有或没有特定'条件'的要求 - 一个简单的整数值 - 要满足).然后将该线程放在队列上并阻塞,直到它成为满足条件的队列中最前面的元素.

这提供了一种非常灵活的同步方式,我发现它在我的程序中非常有用.
现在我真正需要的是一种唤醒具有特定id的特定线程的方法.
但这些问题几乎是相似的.

c++ multithreading locking c++11

13
推荐指数
1
解决办法
4170
查看次数

可以单个SetEvent()触发多个WaitForSingleObject()

这个:

http://msdn.microsoft.com/en-us/library/ms686915(VS.85).aspx

似乎没有暗示.

我有三个进程通过管道进行通信.进程A创建一个事件,进程B&C每个都使用WaitForSingleObject(在第二个线程中).

所以现在我们有-TWO-每个进程等待-SINGLE-事件.

进程A使用SetEvent()触发事件,进程B响应,进程C不响应.

结论:

每个WaitForSingleObject()都需要一个唯一的事件......正确吗?

c++ events winapi

7
推荐指数
1
解决办法
1万
查看次数

互斥锁所有权队列顺序

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

让我举个例子.

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

//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之间的所有权?

如果它与互斥锁是任意的,如何确保第一个等待的线程首先获得所有权?

c++ winapi synchronization mutex

2
推荐指数
1
解决办法
795
查看次数

标签 统计

c++ ×3

winapi ×2

c++11 ×1

events ×1

locking ×1

multithreading ×1

mutex ×1

synchronization ×1