分享一下用到的mutex和condition用法。
Mutex一般有两种使用情况,一种是单独使用,保护临界区。
一种是和condition配合使用,可以等待某condition拿到之后再向下走。
Condition 有两种signal形式, single和 broadcast,下面例子是signal的,
做个参考。
pthread_cond_t ake_cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t ake_mutex = PTHREAD_MUTEX_INITIALIZER;
thread 1: 等待AKE完成的signal
pthread_mutex_lock(&ake_mutex);
if (AKE_STATE_GOT_EXCHANGE_KEY !=DTCP_AKE_Get_Current_State()) {
pthread_cond_wait(&ake_cond, &ake_mutex);
//进入wait状态之后, ake_mutex会处于unlock状态;
//等待拿到ake_cond后,, ake_mutex会变为lock状态;
pthread_cond_wait有多种用法,还有一种pthread_cond_wait带 timeout功能,
可以等待condition某段时间之后如果还拿不到则向下执行,我上次使用有些问题,有兴趣用到时候可以研究下。
}
pthread_mutex_unlock(&ake_mutex);
thread 2: AKE完成之后发送signal
void Decrypt_AKE_Finish_Callback(void){
LOGV(DECRYPTTAG, "[%s: %d] enter", __FUNCTION__, __LINE__);
pthread_mutex_lock(&ake_mutex);
pthread_cond_signal(&ake_cond);
pthread_mutex_unlock(&ake_mutex);
}
/************************************************/
pthread_cond_timedwait 用法
pthread_mutex_lock(&mutex);
clock_gettime(CLOCK_MONOTONIC, &tv);
outtime.tv_sec = tv.tv_sec;
outtime.tv_nsec = tv.tv_nsec + 100 * 1000 * 1000;
if(outtime.tv_nsec > 1000 * 1000 * 1000){
outtime.tv_sec = outtime.tv_sec + outtime.tv_nsec / (1000 * 1000 * 1000);
outtime.tv_nsec = outtime.tv_nsec % (1000*1000*1000);
}
int result = pthread_cond_timedwait(&(pMPthread->m_cond), &mutex, &outtime);
if (result == ETIMEDOUT) {
//MGR_LOGT << "pthread_cond_timedwait timeout!!!";
}
pthread_mutex_unlock(&mutex);
pthread_condattr_init(&m_attr);
pthread_condattr_setclock(&m_attr, CLOCK_MONOTONIC);
pthread_cond_init(&m_cond, &m_attr);
Clock_realtime
代表机器上可以理解为当前的我们所常看的时间,其当time-of-day 被修改的时候而改变,这包括NTP对它的修改(NTP:Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。)
CLOCK_MONOTONIC
代表从过去某个固定的时间点开始的绝对的逝去时间,它不受任何系统time-of-day时钟修改的影响,如果你想计算出在一台计算机上不受重启的影响,两个事件发生的间隔时间的话,那么它将是最好的选择。
更多资料参考:
http://www.360doc.com/content/12/0924/17/706976_237933566.shtml