线程中一种超时机制的实现

mutex+cond+timespec

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t cond_mutex = PTHREAD_MUTEX_INITIALIZER;
struct timespec timeout;

timeout.tv_sec = time(NULL) + TIME_CHECK_VERSION;
timeout.tv_nsec = 0;

/* Mutex must be locked for pthread_cond_timedwait... */
pthread_mutex_lock(&cond_mutex);

/* Thread safe "sleep" */
pthread_cond_timedwait(&cond, &cond_mutex, &timeout);

/* No longer needs to be locked */
pthread_mutex_unlock(&cond_mutex);

条件变量必须和一个互斥锁配合,以防止多个线程同时请求pthread_cond_wait()(或pthread_cond_timedwait(),下同)的竞争条件(Race   Condition)。mutex互斥锁必须是普通锁(PTHREAD_MUTEX_TIMED_NP)或者适应锁(PTHREAD_MUTEX_ADAPTIVE_NP),且在调用pthread_cond_wait()前必须由本线程加锁(pthread_mutex_lock()),而在更新条件等待队列以前,mutex保持锁定状态,并在线程挂起进入等待前解锁。在条件满足从而离开pthread_cond_wait()之前,mutex将被重新加锁,以与进入pthread_cond_wait()前的加锁动作对应。   
    
  激发条件有两种形式,pthread_cond_signal()激活一个等待该条件的线程,存在多个等待线程时按入队顺序激活其中一个;而pthread_cond_broadcast()则激活所有等待线程。

你可能感兴趣的:(mutex,cond,timespec)