J'ai le code suivant qui réplique les événements manuels Windows et les réinitialisations automatiques.Question équivalente à l'événement pthread windows
class event
{
public:
event(bool signalled = false, bool ar = true) :
_auto(ar),
_signalled(signalled)
{
pthread_mutex_init(&_mutex, NULL);
pthread_cond_init(&_cond, NULL);
}
~event()
{
pthread_cond_destroy(&_cond);
pthread_mutex_destroy(&_mutex);
}
void set()
{
pthread_mutex_lock(&_mutex);
// only set and signal if we are unset
if (_signalled == false)
{
_signalled = true;
pthread_cond_signal(&_cond);
}
pthread_mutex_unlock(&_mutex);
}
void wait()
{
pthread_mutex_lock(&_mutex);
while (_signalled == false)
{
pthread_cond_wait(&_cond, &_mutex);
}
// if we're an autoreset event, auto reset
if (_auto)
{
_signalled = false;
}
pthread_mutex_unlock(&_mutex);
}
void reset()
{
pthread_mutex_lock(&_mutex);
_signalled = false;
pthread_mutex_unlock(&_mutex);
}
private:
pthread_mutex_t _mutex;
pthread_cond_t _cond;
bool _signalled;
bool _auto;
};
Ma question entoure la « optimisation » Je l'ai mis en place dans la méthode set()
où je ne convoquent que pthread_cond_signal()
si l'événement a été non signalés. Est-ce une optimisation valide ou ai-je introduit un défaut subtil en le faisant.
C'est dans le cas des événements non-réinitialisation automatique, où vous voulez probablement seulement 1 action basée sur plusieurs ensembles avant la réinitialisation. donc l'ensemble() est en fait meilleur avec "l'optimisation". Généralement, les variables de condition doivent signaler un changement de condition. – stefaanv
@David. Je suis d'accord avec votre évaluation et je vous remercie pour vos commentaires. La nature de réinitialisation automatique de l'événement est telle que l'appel défini sur un objet déjà signalé est un no-op. Donc je pense que le code que j'ai est correct, mais je suis ouvert aux arguments. – ScaryAardvark
Si l'appel sur un événement de réinitialisation manuelle déjà défini est un noop, il ne s'agit pas d'une optimisation, mais d'un comportement correct. Dans le cas contraire, l'appel de l'ensemble avant la réinitialisation de l'événement débloquerait des threads supplémentaires. – nos