linux线程同步--条件变量练习(2)

 注意:消息是由主线程产生的,而消息这时候在堆中,两个线程通过全局变量获取访问消息。

#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>

struct msg {
	int data;
	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);
		while (workq == NULL)
			pthread_cond_wait(&qready, &qlock);
		mp = workq;
		workq = mp->m_next;
		pthread_mutex_unlock(&qlock);
		/* now process the message mp */
		printf("deal the mp. the data is %d\n",mp->data);
		free(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);
}
void* thr_fn(void* arg){
	process_msg();
	return ((void*)1);
}
int main(){
	pthread_t tid1;
	pthread_t tid2;
	int err;
	err = pthread_create(&tid1,NULL,thr_fn,NULL);
	if(err !=0){

		err_quit("can't  create thread%s\n",strerror(err));
	}
	
	err = pthread_create(&tid2,NULL,thr_fn,NULL);
	if(err !=0){
		err_quit("cant' create thread%s\n",strerror(err));
	}
	printf("create success.\n");
	struct msg* mp = malloc(sizeof(struct msg));
	mp->m_next = NULL;
	mp->data = 110;
	enqueue_msg(mp);
	//sleep(5);	
	sleep(1);
	pthread_cancel(tid1);
	pthread_cancel(tid2);
	//pthread_cancel(tid1);
	//pthread_cancel(tid2);		
	printf("ok\n");
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值