有没有一种简单的方法在C++ 0x中实现AutoResetEvent?

问题描述:

我明白我已经问过这个问题之前:What is the C++ equivalent for AutoResetEvent under Linux?有没有一种简单的方法在C++ 0x中实现AutoResetEvent?

不过,我正在学习,在C++ 0x中,线程库是由简单得多,所以我想出去再提出这个问题,是有在C++ 0x中实现AutoResetEvent的简单方法?

这里是accepted answer to your first question的翻译使用C++ 11点的工具:

#include <mutex> 
#include <condition_variable> 
#include <thread> 
#include <stdio.h> 

class AutoResetEvent 
{ 
    public: 
    explicit AutoResetEvent(bool initial = false); 

    void Set(); 
    void Reset(); 

    bool WaitOne(); 

    private: 
    AutoResetEvent(const AutoResetEvent&); 
    AutoResetEvent& operator=(const AutoResetEvent&); // non-copyable 
    bool flag_; 
    std::mutex protect_; 
    std::condition_variable signal_; 
}; 

AutoResetEvent::AutoResetEvent(bool initial) 
: flag_(initial) 
{ 
} 

void AutoResetEvent::Set() 
{ 
    std::lock_guard<std::mutex> _(protect_); 
    flag_ = true; 
    signal_.notify_one(); 
} 

void AutoResetEvent::Reset() 
{ 
    std::lock_guard<std::mutex> _(protect_); 
    flag_ = false; 
} 

bool AutoResetEvent::WaitOne() 
{ 
    std::unique_lock<std::mutex> lk(protect_); 
    while(!flag_) // prevent spurious wakeups from doing harm 
    signal_.wait(lk); 
    flag_ = false; // waiting resets the flag 
    return true; 
} 


AutoResetEvent event; 

void otherthread() 
{ 
    event.WaitOne(); 
    printf("Hello from other thread!\n"); 
} 


int main() 
{ 
    std::thread h(otherthread); 
    printf("Hello from the first thread\n"); 
    event.Set(); 

    h.join(); 
} 

输出:

Hello from the first thread 
Hello from other thread! 

更新

在下面tobsen指出,AutoResetEvent评论具有signal_.notify_all()而不是的语义。我没有更改代码,因为accepted answer to the first question使用的是pthread_cond_signal而不是pthread_cond_broadcast,而且我领导的声明是这是对该答案的忠实翻译。

+0

谢谢!这是一个非常明确的解释! :) – derekhh 2011-12-16 19:38:07