2009-09-30 34 views
12

Tôi tự hỏi nếu có một tương đương tăng của ManualResetEvent? Về cơ bản, tôi muốn có một nền tảng thực hiện ... Hoặc, ai đó có thể giúp tôi bắt chước chức năng của ManualResetEvent bằng cách sử dụng Boost :: thread? Thanks guysTăng tương đương với ManualResetEvent?

+0

Bạn muốn mô phỏng chức năng sự kiện nào? – curiousguy

Trả lời

12

Thật dễ dàng để viết sự kiện đặt lại thủ công khi bạn có biến mutex và biến điều kiện.

Điều bạn cần là trường thể hiện sự kiện đặt lại của bạn có được báo hiệu hay không. Truy cập vào trường sẽ cần được bảo vệ bởi một mutex - điều này bao gồm cả cài đặt/đặt lại sự kiện của bạn cũng như kiểm tra xem liệu nó có được báo hiệu hay không.

Khi bạn đang chờ sự kiện của mình, nếu sự kiện hiện tại không được báo hiệu, bạn sẽ phải chờ một biến điều kiện cho đến khi nó được báo hiệu. Cuối cùng, trong mã của bạn để đặt sự kiện, bạn sẽ muốn thông báo biến điều kiện để đánh thức bất kỳ ai đang chờ sự kiện của bạn.

class manual_reset_event 
{ 
public: 
    manual_reset_event(bool signaled = false) 
     : signaled_(signaled) 
    { 
    } 

    void set() 
    { 
     { 
      boost::lock_guard<boost::mutex> lock(m_); 
      signaled_ = true; 
     } 

     // Notify all because until the event is manually 
     // reset, all waiters should be able to see event signalling 
     cv_.notify_all(); 
    } 

    void unset() 
    { 
     boost::lock_guard<boost::mutex> lock(m_); 
     signaled_ = false; 
    } 


    void wait() 
    { 
     boost::lock_guard<boost::mutex> lock(m_); 
     while (!signaled_) 
     { 
      cv_.wait(lock); 
     } 
    } 

private: 
    boost::mutex m_; 
    boost::condition_variable cv_; 
    bool signaled_; 
}; 
+1

Tôi nghĩ bạn có thể cần sử dụng 'boost :: condition_variable_any' để làm việc này. Xem: http://stackoverflow.com/questions/8758353/whats-the-difference-between-stdcondition-variable-and-stdcondition-variable – Nick

+0

Ngoài ra, điều kiện_variable_any :: phương thức chờ đợi phải được cung cấp mutex làm tham số, không phải là bảo vệ khóa. – Oliver

+0

Hmm, tôi nhận được: lỗi C2664 'void boost :: condition_variable :: wait (boost :: unique_lock &)': không thể chuyển đổi tham số 1 từ 'boost :: lock_guard ' thành 'boost :: unique_lock &' Nó tôi sử dụng condition_variable_any, tôi nhận được một lỗi bên trong condition_variable về mở khóa() phương pháp không tồn tại. – Alexander

1

IIRC, ManualResetEvent s tồn tại để cho phép nhiều chủ đề chờ đợi trên một đối tượng và một chuỗi để đánh thức tại thời điểm đối tượng được báo hiệu. Phần "đặt lại thủ công" xuất phát từ thực tế là hệ thống không tự động đặt lại sự kiện sau khi nó đánh dấu một chuỗi; bạn làm điều đó thay thế.

này nghe có vẻ rất giống với condition variables:

Các mô hình sử dụng chung là một thread khóa một mutex và sau đó gọi wait trên một thể hiện của condition_variable hoặc condition_variable_any. Khi luồng được đánh thức từ khi chờ, sau đó nó sẽ kiểm tra xem điều kiện thích hợp có đúng hay không và tiếp tục nếu như vậy. Nếu điều kiện là không đúng, sau đó các chủ đề sau đó gọi wait một lần nữa để tiếp tục chờ đợi.

+0

Về cơ bản, tôi chỉ có một luồng văn bản phải viết và không bao giờ bị chặn, trong khi tôi có một chuỗi trình đọc chỉ đọc được khi người viết không viết ... nếu điều đó có ý nghĩa. Cảm ơn – Polaris878

+0

Tôi sẽ nói rằng thiết kế của bạn có ý nghĩa. –