2011-12-16 6 views

Trả lời

12

Dưới đây là bản dịch của accepted answer to your first question sử dụng C++ 11 công cụ:

#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(); 
} 

Output:

Hello from the first thread 
Hello from other thread! 

Cập nhật

Trong những ý kiến ​​dưới đây tobsen ghi chú rằng AutoResetEvent có ngữ nghĩa của signal_.notify_all() thay vì signal_.notify_one(). Tôi đã không thay đổi mã vì accepted answer to the first question đã sử dụng pthread_cond_signal như trái ngược với pthread_cond_broadcast và tôi dẫn đầu với tuyên bố rằng đây là bản dịch trung thành của câu trả lời đó.

+0

Cảm ơn! Đó là một cách giải thích rất rõ ràng! :) – derekhh

+1

Trên thực tế, có thể tạo ra bế tắc nếu Set được thực hiện trước WaitOne (như được giải thích trong câu trả lời cho câu hỏi được liên kết trong câu trả lời này) –

+0

Hoạt động tốt. Không có cơ hội của deadlocks nhờ 'bool flag_' và [how' wait() 'làm việc với' std :: unique_lock'] (http://en.cppreference.com/w/cpp/thread/condition_variable/wait). –