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 đó.
Nguồn
2011-12-16 18:45:46
Cảm ơn! Đó là một cách giải thích rất rõ ràng! :) – derekhh
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) –
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). –