【问题标题】:Thread sleep & wakeup on WinOS线程睡眠和唤醒在 Windows 上
【发布时间】:2013-01-02 12:15:39
【问题描述】:

如何在 WinOS 上实现类似 pthreads pthread_cond_signal 的东西。我不想为此使用 pthreads Win32 端口,因为我也支持 Win64。

我正在开发一个基于任务的系统,其中客户端请求产生 n 个任务,这些任务在服务器上产生 n 个线程。在客户端线程产生所有服务器任务后,我希望它进入睡眠状态或其他不消耗任何系统资源的线程状态。当所有服务器任务完成后,我希望客户端线程被唤醒并将结果返回给客户端应用程序。

编辑: 我考虑过在一些共享内存中等待条件变量,并在循环中检查 condvar,但循环不会消耗资源吗?我可以在循环中添加一个sleep(),但是我不会得到实时的客户端请求和服务器响应——因为一个任务可能需要 1/1000 秒(但也需要几秒)。

【问题讨论】:

  • 我认为 WinOS 是指 Microsoft Windows(某种)。有一个广泛的条件变量 API,具有高效的等待机制 (WaitForMultipleObjects)。当轮子已经在 API 中时,不要重新实现它
  • @Petesh 好点,我倾向于这样做。很高兴知道 Windows 中有用于此的 API 方法。谢谢。
  • 只是为了避免误解:有一个 64 位版本的 PThreads for Windows 可用。最新的二进制文件可以在这里下载:sourceware.org/pub/pthreads-win32/dll-latest/dll/x64(win32 指的是使用的 API,它的名字确实有点误导,因为取决于 win 版本,它还支持 64 位应用程序)
  • @alk 很高兴知道 - 命名确实具有误导性。

标签: c++ multithreading concurrency pthreads


【解决方案1】:

Win32 API 在 Vista 及更高版本上支持条件变量。有关 API,请参阅 this MSDN page,有关用法示例,请参阅 this one。

WakeConditionVariable() 等价于pthread_cond_signal() 和WakeAllConditionVariable() 等价于pthread_cond_broadcast()

也就是说,如果您使用的是 VS2012,我真的建议您使用新的 C++11 threading library。它还支持condition variables,由于在多个平台上运行对您来说很重要,因此使用标准库可以帮助您最终合并您的代码库。

【讨论】:

  • 我正在使用 VS 2012 - 我肯定会研究 C++ 11 线程库。谢谢。
【解决方案2】:

您可以使用事件函数和 WaitForMultipleObject 等

关于事件函数的更多信息: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686360(v=vs.85).aspx#event_functions

更多关于 WaitForSingleObject 的信息在这里: http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx

更多关于win32同步的信息: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686360(v=vs.85).aspx

【讨论】:

    猜你喜欢
    • 2014-07-29
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2011-07-29
    • 2011-06-01
    • 2011-03-28
    相关资源
    最近更新 更多