关于条件变量的一点理解

        条件变量是线程的另一种同步机制,它和互斥量是一起使用的。互斥量的目的就是为了加锁,而条件变量的结合,

使得线程能够以等待的状态来迎接特定的条件发生,而不需要频繁查询锁。

 

        条件变量的使用需要条件变量和互斥量:

pthread_cond_t cond;
pthread_mutex_t mutex;


        使用例子中,可看APUE上的一个例程:

#include <pthread.h>

struct msg {
	struct msg *m_next;
	/* ... more stuff here ... */
};

struct msg *workq;
pthread_cond_t qready = PTHREAD_COND_INITIALIZER;
pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;

void
process_msg(void)
{
	struct msg *mp;

	for (;;) {
		pthread_mutex_lock(&qlock);a
		while (workq == NULL)
			pthread_cond_wait(&qready, &qlock);
		mp = workq;
		workq = mp->m_next;
		pthread_mutex_unlock(&qlock);
		/* now process the message mp */
	}
}

void
enqueue_msg(struct msg *mp)
{
	pthread_mutex_lock(&qlock);
	mp->m_next = workq;
	workq = mp;
	pthread_mutex_unlock(&qlock);
	pthread_cond_signal(&qready); //通知等待线程条件状态改变
}


        其中包括条件变量和互斥量的初始化,是必需的步骤。这一例程是对msg队列的一个处理。队列在加入消息后便可通知等待

的线程处理消息。首先在队列加入消息时是需要加锁的,加入消息后解锁。

        重点关注消息处理函数,它在进入消息处理时加上了锁,然后调用pthread_cond_wait(&qready, &qlock) ,然后这个函数会

把调用线程放到等待条件的线程列表上,并对互斥量进行解锁,当线程被通知返回时,互斥量再次被锁住。(我就是在这里开始没弄明白)

 

        另一个问题是,加入消息的函数中, 是先解锁,还是先发送通知消息。其实都可以,但都有一点问题:如果先通知了,那么

等待的线程运行之后就会阻塞住(因为锁还没解开)。如果先解锁了,那么在通知等待线程之前,这个线程可能会获得互斥锁,

使条件失效,那么再通知的时候,条件就没意义了,这时需要做一些检查,确保信息已存在,再执行处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值