Un AutoResetEvent è più simile a un semaforo binario. Le persone che dicono "variabili condizionali" non sono sbagliate di per sé, ma le variabili di condizione sono usate in situazioni simili, piuttosto che essere oggetti simili. È possibile implementare un AutoResetEvent (senza nome) sulla parte superiore del variabili di condizione:
#include <pthread.h>
#include <stdio.h>
class AutoResetEvent
{
public:
explicit AutoResetEvent(bool initial = false);
~AutoResetEvent();
void Set();
void Reset();
bool WaitOne();
private:
AutoResetEvent(const AutoResetEvent&);
AutoResetEvent& operator=(const AutoResetEvent&); // non-copyable
bool flag_;
pthread_mutex_t protect_;
pthread_cond_t signal_;
};
AutoResetEvent::AutoResetEvent(bool initial)
: flag_(initial)
{
pthread_mutex_init(&protect_, NULL);
pthread_cond_init(&signal_, NULL);
}
void AutoResetEvent::Set()
{
pthread_mutex_lock(&protect_);
flag_ = true;
pthread_mutex_unlock(&protect_);
pthread_cond_signal(&signal_);
}
void AutoResetEvent::Reset()
{
pthread_mutex_lock(&protect_);
flag_ = false;
pthread_mutex_unlock(&protect_);
}
bool AutoResetEvent::WaitOne()
{
pthread_mutex_lock(&protect_);
while(!flag_) // prevent spurious wakeups from doing harm
pthread_cond_wait(&signal_, &protect_);
flag_ = false; // waiting resets the flag
pthread_mutex_unlock(&protect_);
return true;
}
AutoResetEvent::~AutoResetEvent()
{
pthread_mutex_destroy(&protect_);
pthread_cond_destroy(&signal_);
}
AutoResetEvent event;
void *otherthread(void *)
{
event.WaitOne();
printf("Hello from other thread!\n");
return NULL;
}
int main()
{
pthread_t h;
pthread_create(&h, NULL, &otherthread, NULL);
printf("Hello from the first thread\n");
event.Set();
pthread_join(h, NULL);
return 0;
}
Se, tuttavia, è necessario nominato eventi di ripristino automatico, è probabile che vuole guardare i semafori, e può avere un momento leggermente più difficile traduzione il tuo codice. Ad ogni modo guarderei con attenzione alla documentazione per i pthread sulla tua piattaforma, le variabili di condizione e gli eventi di reset automatico non sono gli stessi e non si comportano allo stesso modo.
fonte
2011-11-14 22:21:40
No, non assomiglia affatto a un mutex. È più come una variabile di condizione. – Gabe