mutex和condition的用法

来源:互联网 发布:巫师3低配优化补丁 编辑:程序博客网 时间:2024/05/12 12:00

分享一下DTCP-IP中用到的mutexcondition用法。

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 (DTCP_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 DTCP_Decrypt_AKE_Finish_Callback(void){

                               DTCPLOGV(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

0 0