linux基础编程 多线程同步 pthread_cond_signal

条件变量同步锁示例

此例根据上一篇文章修改

请包含上一篇中的两个文件(未做任何改动)

1/ pthread_mutex.h

2/ pthread_mutex.c


上一篇的thread.c文件修改如下

/*
多线程同步示例,条件变量同步锁
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

#include "pthread_mutex.h"

#define __DEBUG
#ifdef __DEBUG
#define DBG(fmt,args...) fprintf(stdout,  fmt,  ##args)
#else
#define DBG(fmt,args...)
#endif
#define ERR(fmt,args...) fprintf(stderr,  fmt,  ##args)

static int isThreadQuit = 0;
SemHandl_t gHndlSem = NULL;
/*条件变量同步锁*/
pthread_cond_t gNoneZero;
unsigned int gCount = 0;//条件变量
/*
某设备写操作,不同同时访问,所以所以需要线程锁保护
1、将函数DeviceWrite中加锁
2、在访问DeviceWrite的线程中加锁
以上两种方法跟据需要选择其一。
本例中在访问的线程中加锁
*/
void DeviceWrite(char *str)
{
	/*SemWait(gHndlSem);*/
	DBG("Device Write: %s\n",str);
	/*SemRelease(gHndlSem);*/
}
void SetXxThreadQuit()
{	
	/*quit*/
	isThreadQuit = 1;
}
void *XxManageThread(void *arg)
{
	char *cmd = (char*)arg;
	DBG("arg value=%s\n",cmd);
	while(isThreadQuit==0){
		
		SemWait(gHndlSem);// 1、先锁定
		while(gCount==0){// 2、判断条件变量
			pthread_cond_wait(&gNoneZero,gHndlSem);// 3、如果满足,等待
		}
		gCount = gCount-1;// 4、条件变量做相应调整
		DBG("gCount=%d\n",gCount);
		SemRelease(gHndlSem); // 5、开锁

		sleep(1);
		
	}
	/*arg是将指针带进来,cmd则相反,或者设置 NULL*/
	pthread_exit(cmd);
	//pthread_exit(NULL);
}
void *XxManageThreadMutex(void *arg)
{
	char *cmd = (char*)arg;
	DBG("arg value=%s\n",cmd);
	while(isThreadQuit==0){
		
		SemWait(gHndlSem);
		if(gCount == 0){
			pthread_cond_signal(&gNoneZero);
		}
		gCount = gCount+1;
		DBG("gCount=%d\n",gCount);
		SemRelease(gHndlSem);
		
		sleep(1);
		
	}
	/*arg是将指针带进来,cmd则相反,或者设置 NULL*/
	pthread_exit(cmd);
	//pthread_exit(NULL);
}

int XxManageThreadInit()
{
	pthread_t tManageThread;
	pthread_t tManageThreadMutex;
	
	char *any="any value";
	char *retn;
	int ret;
	/*
	  第二个参数是设置线程属性,一般很少用到(设置优先级等),第四个参数为传递到线程的指针,
	  可以为任何类型
	*/
	ret = pthread_create(&tManageThread,NULL,XxManageThread,"1 thread");
	if(ret == -1){
		/*成功返回0.失败返回-1*/
		ERR("Ctreate Thread ERROR\n");
		return -1;
	}

	ret = pthread_create(&tManageThreadMutex,NULL,XxManageThreadMutex,"2 thread");
	if(ret == -1){
		/*成功返回0.失败返回-1*/
		ERR("Ctreate Thread ERROR\n");
		return -1;
	}
	
	/*
	  设置线程退出时资源的清理方式,如果是detach,退出时会自动清理
	  如果是join,则要等待pthread_join调用时才会清理
	*/
	pthread_detach(tManageThread);
	pthread_detach(tManageThreadMutex);
	//pthread_join(tManageThread,retn);
	//DBG("retn value=%s\n",retn);
	return 0;
}

#define TEST_MAIN
#ifdef TEST_MAIN
int main()
{
	printf("hello liuyu\n");
	int count=3;
	/*创建线程锁*/
	gHndlSem = MakeSem();
	if(gHndlSem == NULL){
		return -1;
	}
	/*条件变量同步锁初始化*/
	pthread_cond_init(&gNoneZero,NULL);
	
	if(XxManageThreadInit()==-1){
		exit(1);
	}
	
	while(count--){
		DBG("[0] main running\n");
		sleep(2);
	}
	
	SetXxThreadQuit();
	/*等待线程结束*/
	sleep(1);
	/*删除条件变量同步锁*/
	pthread_cond_destroy(&gNoneZero);
	/*删除线程锁*/
	DestroySem(gHndlSem);
	DBG("waitting thread exit...\n");
	return 0;
}
#endif


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值