【发布时间】:2016-05-30 09:25:04
【问题描述】:
我正在尝试对许多CONDITION_VARIABLE 实施某种等待。
The answers here 暗示 WaitForMultipleObjects 等是处理 Windows API(以及互联网上的更多地方)时的有效选项,但似乎并非如此。
首先,MSDN 文档中没有写到 Windows 条件变量是 WaitFor... 函数的有效参数。
其次,WaitFor... 似乎只接受HANDLE 类型作为参数,这基本上是一个内核对象。但PCONDITION_VARIABLE 并不是真正的HANDLE。
最后,尝试使用条件变量(作为PCONDITION_VARIABLE 和未记录的CONDITION_VARIABLE::Ptr)使函数返回错误代码6(无效句柄)
例如:
CONDITION_VARIABLE cv;
InitializeConditionVariable(&cv);
auto res = WaitForSingleObject(cv.Ptr, INFINITE); //returns immediately
if (res != WAIT_OBJECT_0) {
auto ec = GetLastError();
std::cout << ec << "\n";
}
那么,你真的可以等待一个条件变量还是只是一个都市传说?
【问题讨论】:
-
条件变量是用户模式对象。 WaitFor... 只能等待内核句柄。
-
我在链接的答案中看不到任何暗示,你是怎么做的。首先,它是在谈论
boost::condition_variable,而不是std::condition_variable 或CONDITION_VARIABLE。并且没有任何答案暗示WaitForXxx系列函数可以与这些函数一起使用(接受的答案明确指出“如果您愿意将代码限制为 Windows 同步原语”)。抱歉,-1 表示研究不足。 -
如果您愿意将您的代码限制为 Windows 同步原语",那 "又如何呢?
std::condition_variable不是 Windows 同步原语。 -
我认为你做不到。你用
SleepConditionVariableCS等待一个。我不确定等待多个条件变量是否有意义,因为这意味着您持有几个关键部分并希望一次释放所有关键部分。 (这可能是有道理的,但我相信这种情况非常罕见,以至于您需要自己实现。) -
@DavidHaim 我相信您最好的选择是您链接的问题的公认答案中的方法。 (也就是说,使用一个条件变量并在发出信号时检查世界的状态。)
标签: c++ windows winapi synchronization