【问题标题】:Win32 events vs. condition variablesWin32 事件与条件变量
【发布时间】:2011-08-15 21:23:25
【问题描述】:

我正在写一个win32 library,我需要使用win32 线程实现一个生产者-消费者队列。到目前为止,一切进展顺利,但我面临一个两难的境地:我应该使用events 还是condition variables 向消费者发出添加了某些内容的信号?我见过可以使用其中任何一种的示例。就我个人而言,我需要能够同时等待多个信号(一个 item push 信号和一个 quit 信号)。只有一个生产者和一个消费者。

各有什么优缺点?鉴于我的要求,你会推荐什么,为什么?谢谢!

【问题讨论】:

    标签: multithreading winapi


    【解决方案1】:

    通常读取实现为:

    WaitForSingleObject(evt);   // 1
    EnterCriticalSection(&cs);  // 2
    //... fetching data from the queue
    LeaveCriticalSection(&cs);  // 3
    

    但是对于条件变量(特殊类型的事件),第 1 行和第 2 行可以替换 通过一次调用 SleepConditionVariableCS() 以原子方式执行 1 和 2 操作。

    在大量情况下(频繁的 R/W 操作),这会给您带来一些好处。

    【讨论】:

    • 注意:这在 XP 上不存在。
    • 由于他需要同时等待多个信号,WaitForMultipleObjects 会比 WaitForSingleObject 更好。
    • 好吧,鉴于这个项目确实需要在 Windows XP 上运行,我想这会让选择变得容易。谢谢!
    • 顺便说一句:通常“一个项目推送信号和一个退出信号”组合成单个事件“队列状态改变”等。 bool queue::read(data& d); // returns false if queue was closed
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2012-07-10
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 2010-11-15
    相关资源
    最近更新 更多