2011-12-16 13 views

Odpowiedz

12

Oto tłumaczenie accepted answer to your first question używać C++ 11 narzędzi:

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

wyjściowa:

Hello from the first thread 
Hello from other thread! 

Aktualizacja

W komentarzach poniżej tobsen zauważa, że ​​AutoResetEvent ma semantykę signal_.notify_all() zamiast signal_.notify_one(). Nie zmieniłem kodu, ponieważ accepted answer to the first question użyłem pthread_cond_signal w przeciwieństwie do pthread_cond_broadcast i prowadzę z oświadczeniem, że jest to wierne tłumaczenie tej odpowiedzi.

+0

Dzięki! To była bardzo jasna interpretacja! :) – derekhh

+1

W rzeczywistości jest w stanie spowodować zakleszczenie, jeśli Set został wykonany przed WaitOne (jak wyjaśniono w odpowiedzi na pytanie powiązane w tej odpowiedzi) –

+0

Działa dobrze. Brak szans na zakleszczenia dzięki 'bool flag_' i [jak' wait() 'działa z' std :: unique_lock'] (http://en.cppreference.com/w/cpp/thread/condition_variable/wait). –

Powiązane problemy