linux下c语言多线程之条件变量

1.条件变量机制:
条件变量机制弥补了互斥机制的缺陷,允许一个线程向另一个线程发送信号(这意味着共享资源某种条件满足时,可以通过某个线程发信号的方式通知等待的线程),允许阻塞等待线程(当线程等待共享资源某个条件时,可让该线程阻塞,等待其他线程发送信号通知)。
条件变量机制在处理等待共享资源满足某个条件问题时,具有非常高的效率,且空间消耗相比互斥机制也有优势。
2.条件变量与互斥量:
条件变量机制,所有等待一个条件变量的线程会形成一个队列,这个队列显然是全局的共享队列。当线程进入等待状态,将线程添加到队列就需要使用互斥量,防止多个线程同时使用pthread_cond_wait,在调用pthread_cond_wait前加锁互斥量,进入阻塞前解锁互斥量。这也解释了pthread_cond_wait函数参数需要互斥量。
3.条件变量基本函数:
#include <semaphore.h>
初始化条件变量:
int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr) ;
该函数第一个参数为条件变量指针,第二个参数为条件变量属性指针(一般设为NULL)。该函数按照条件变量属性对条件变量进程初始化。
无条件等待:
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
该函数第一个参数为条件变量指针,第二个为互斥量指针。该函数调用前,需本线程加锁互斥量,加锁状态的时间内函数完成线程加入等待队列操作 ,线程进入等待前函数解锁互斥量。在满足条件离开pthread_cond_wait函数之前重新获得互斥量并加锁,因此,本线程之后需要再次解锁互斥量。
通知一个线程:
int pthread_cond_signal(pthread_cond_t *cond);
该函数的参数为条件变量指针。该函数向队列第一个等待线程发送信号,解除这个线程的阻塞状态。
通知所有线程:
int pthread_cond_broadcast(pthread_cond_t *cond);
该函数的参数为条件变量指针。该函数想队列所有等待线程发送信号,解除这些线程的阻塞状态。
销毁条件变量:
int pthread_cond_destroy(pthread_cond_t *cond);
该函数销毁条件变量。

#include "pthread.h"
#include "sched.h"
#include "semaphore.h"
#include "stdio.h"
pthread_t t1;           //pthread_t变量t1,用于获取线程1的ID
pthread_t t2;           //pthread_t变量t2,用于获取线程2的ID
pthread_mutex_t mutex;
pthread_cond_t cond;
int i=0;                //共享资源
void * child1(void *arg)
{
	while(1)
	{
		pthread_mutex_lock(&mutex);
		i++;
		if(i%5==0)
		{
			pthread_cond_signal(&cond);
		}
		else
		{
			printf("我是线程  1  打印的数都非5的倍数:  %d \n",i);
		}
		pthread_mutex_unlock(&mutex);
		sleep(1);
	}
}     
void *child2(void *arg)
{
	while(1)
	{
		pthread_mutex_lock(&mutex);
		printf("code before pthread_con_wait");
		pthread_cond_wait(&cond,&mutex);       //获得信号之前,会重新获得互斥锁
		printf("我是线程  2  打印5的倍数:  %d \n",i);
		pthread_mutex_unlock(&mutex);          //需要在此处释放互斥锁
		sleep(1);
	}
}
int main(void)
{        
	pthread_cond_init(&cond,NULL);
	pthread_mutex_init(&mutex,NULL);
	pthread_create(&t1,NULL,child1,NULL);
	pthread_create(&t2,NULL,child2,NULL);
	sleep(100000000);
	return 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值