pthread_cond_wait()

本文深入解析了pthread_cond_wait函数的工作原理,包括如何使用互斥量和条件变量来协调线程间的数据访问。通过一个具体的多线程编程示例,展示了如何控制三个线程分别打印100以内5的倍数、3的倍数和其他数字,以实现精确的线程同步。

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);

        该函数第一个参数为条件变量指针,第二个为互斥量指针。该函数调用前,需本线程加锁互斥量,加锁状态的时间内函数完成线程加入等待队列操作 ,线程进入等待前函数解锁互斥量。在满足条件离开pthread_cond_wait函数之前重新获得互斥量并加锁,因此,本线程之后需要再次解锁互斥量。

pthread_mutex_lock(&mymutex);
然后,它检查了列表。没有找到感兴趣的东西,于是它调用:
pthread_cond_wait(&mycond, &mymutex);
 
然后,pthread_cond_wait() 调用在返回前执行许多操作:
 
pthread_mutex_unlock(&mymutex);
 
它对 mymutex 解锁,然后进入睡眠状态,等待 mycond 以接收 POSIX 线程“信号”。一旦接收到“信号”(加引号是因为我们并不是在讨论传统的 UNIX 信号,而是来自 pthread_cond_signal() 或 pthread_cond_broadcast() 调用的信号),它就会苏醒。但 pthread_cond_wait() 没有立即返回 -- 它还要做一件事:重新锁定 mutex:
pthread_mutex_lock(&mymutex);
 
pthread_cond_wait() 知道我们在查找 mymutex “背后”的变化,因此它继续操作,为我们锁定互斥对象,然后才返回。

https://www.cnblogs.com/diyingyun/archive/2011/11/25/2263164.html

打印100 ,一个线程打印5的倍数,一个线程打印3 的倍数,另外一个线程打印其他数

#include <pthread.h>
#include <iostream>
#include <windows.h>
using namespace std;


pthread_t t1;           //pthread_t变量t1,用于获取线程1的ID
pthread_t t2;           //pthread_t变量t2,用于获取线程2的ID     
pthread_t t3;
pthread_mutex_t mutex;
pthread_cond_t cond;
pthread_cond_t cond1;
int i = 0;                //共享资源
void* child1(void* arg)
{
	int j = 1;
	while (j <= 100)
	{
		j++;
		pthread_mutex_lock(&mutex);
		i++;
		if (i % 15 == 0)
		{
			pthread_cond_signal(&cond);
			pthread_cond_signal(&cond1);
		}
		else if (i % 3 == 0)
		{
			pthread_cond_signal(&cond);
		}
		else if (i % 3 == 0)
		{
			pthread_cond_signal(&cond1);
		}
		else
		{
			printf("我是线程  1  打印的数都非5的倍数:  %d \n", i);
		}
		pthread_mutex_unlock(&mutex);
		Sleep(1000);
	}
	return NULL;
}
void* child2(void* arg)
{
	while (1)
	{
		pthread_mutex_lock(&mutex);
		pthread_cond_wait(&cond, &mutex);       //获得信号之前,会重新获得互斥锁
		printf("我是线程  2  打印3的倍数:  %d \n", i);
		pthread_mutex_unlock(&mutex);          //需要在此处释放互斥锁
		Sleep(1000);
	}
}
void* child3(void* arg)
{
	while (1)
	{
		pthread_mutex_lock(&mutex);
		pthread_cond_wait(&cond1, &mutex);       //获得信号之前,会重新获得互斥锁
		printf("我是线程  3  打印5的倍数:  %d \n", i);
		pthread_mutex_unlock(&mutex);          //需要在此处释放互斥锁
		Sleep(1000);
	}
}
int main(void)
{

	pthread_cond_init(&cond, NULL);
	pthread_cond_init(&cond1, NULL);
	pthread_mutex_init(&mutex, NULL);
	pthread_create(&t1, NULL, child1, NULL);
	pthread_create(&t2, NULL, child2, NULL);
	pthread_create(&t3, NULL, child3, NULL);
	Sleep(100000000);

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值