Linux入门:线程同步与互斥(二)——条件变量

本文深入探讨Linux中的线程同步机制,重点关注条件变量的使用。通过一个生产者-消费者模型的实例,阐述了如何初始化、销毁条件变量,以及如何在特定条件下进行等待和唤醒执行流。程序演示了如何利用条件变量和互斥锁实现单链表的数据共享,确保线程安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      条件变量和互斥量的初始化和销毁类似(一个条件变量总是和一个mutex搭配使用的):

1.初始化条件变量


2.销毁条件变量


3.在某条件下等待

调用这个等待函数的时候这个函数其实做了三件事:

首先释放mutex;然后开始进行阻塞式等待;当被唤醒时,重新获得mutex并返回


4.唤醒执行流


程序示例:基于单链表的生产者——消费者模型




运行结果:


程序代码:

#include <stdio.h>
#include <malloc.h>
#include <pthread.h>
#include <unistd.h>
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

//单链表的基本操作
typedef struct Node
{
	int _data;
	struct Node *pNext;
}Node,*pNode;

static pNode alloc_node(int data)
{
	pNode _h = (pNode)malloc(sizeof(Node));
	_h->_data = data;
	_h->pNext = NULL;
}

//初始化
void init_list(pNode *_h)
{
	*_h = alloc_node(0);	
}

//头插
void push_list(pNode _h, int data)
{
	pNode _n = alloc_node(data);
	_n->pNext = _h->pNext;
	_h->pNext = _n;
}

//判空
int is_empty(pNode _h)
{
	return ((_h->pNext==NULL)?1:0);
}

//删除结点
void delete_node(pNode _tmp)
{
	if(!_tmp)
	{
		free(_tmp);
	}
}

//头删
void pop_list(pNode _h, int *_o)
{
	if(!is_empty(_h))
	{
		pNode _tmp = _h->pNext;
		_h->pNext = _tmp->pNext;
		*_o = _tmp->_data;
		delete_node(_tmp);
	}
	else
	{
		printf("list is empty...\n");
	}
}

//销毁单链表
void destroy_list(pNode _h)
{
	int data;
	while(!is_empty(_h));
	{
		pop_list(_h, &data);
	}
	delete_node(_h);
}

//打印单链表
void show_list(pNode _h)
{
	pNode p = _h->pNext;
	while(p)
	{
		printf("%d->", p->_data);
		p = p->pNext;
	}
	printf("\n");
}

//消费者
static void *consumer(void *arg)
{
	pNode h = (pNode) arg;
	for(; ;)
	{
		pthread_mutex_lock(&lock);
		int data = rand()%1234;
		while(is_empty(h))//判断:单链表为空时则不能消费
		{
			printf("can't consume now...\n'");
			pthread_cond_wait(&cond, &lock);//等待
		}
		pop_list(h, &data);
		printf("product done...%d\n", data);
		pthread_mutex_unlock(&lock);
	}
}

//生产者
static void *producer(void *arg)
{
	pNode h = (pNode) arg;
	for(; ;)
	{
		pthread_mutex_lock(&lock);
		int data = rand()%1234;
		push_list(h, data);
		printf("now can consuming...%d\n", data);
		pthread_mutex_unlock(&lock);
		sleep(1);
		pthread_cond_signal(&cond);//唤醒消费者
	}
}

int main()
{

	Node *head = NULL;
	init_list(&head);
	pthread_t id1, id2;
	pthread_create(&id1, NULL, consumer, head);
	pthread_create(&id2, NULL, producer, head);
	pthread_join(id1, NULL);
	pthread_join(id2, NULL);

	pthread_mutex_destroy(&lock);
	pthread_cond_destroy(&cond);
   //	for( ; i<10; i++)
   //	{
	//	push_list(head, i);
	//	show_list(head);
	//	sleep(1);
//	}
	//int data = 0;
//	for(; i>5; i--)
//	{
//		pop_list(head, &data);
//		show_list(head);
//		sleep(1);
//	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值