线程中的 条件变量 pthread_cond_t

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*初始化互斥锁*/
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;/*初始化条件变量*/
void *thread1(void *);
void *thread2(void *);
int i=1;
int main(void)
{
    pthread_t t_a;
    pthread_t t_b;
    pthread_create(&t_a,NULL,thread1,(void *)NULL);/*创建进程t_a*/
    pthread_create(&t_b,NULL,thread2,(void *)NULL); /*创建进程t_b*/
    pthread_join(t_a, NULL);/*等待进程t_a结束*/
    pthread_join(t_b, NULL);/*等待进程t_b结束*/
    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);
    exit(0);
}
void *thread1(void *junk)
{
    for(i=1;i<=6;i++)
    {
		printf("\n1111111111     i is %d         111111111111\n",i);
        pthread_mutex_lock(&mutex);/*锁住互斥量*/
		printf("thread1: lock %d\n", __LINE__);
        if(i%3==0){
			printf("thread1:signal 1  line:%d   i is %d \n", __LINE__,i);
            pthread_cond_signal(&cond);/*条件改变,发送信号,通知t_b进程*/
			printf("thread1:signal 2  %d\n", __LINE__);
			sleep(1);
		}
        pthread_mutex_unlock(&mutex);/*解锁互斥量*/
		printf("thread1: unlock %d\n\n", __LINE__);
		sleep(1);
	}
}
void *thread2(void *junk)
{
    while(i<6)
    {

		printf("2222222222222 in pthread2 i is %d 222222222222222222 \n",i);
        pthread_mutex_lock(&mutex);
		printf("thread2: lock line:%d   i is %d\n", __LINE__,i);
		if(i%3!=0){
			printf("thread2: wait 1  %d\n", __LINE__);
            pthread_cond_wait(&cond,&mutex);/*解锁mutex,并等待cond改变*/

			printf("thread2: wait 2  %d\n", __LINE__);
			printf("thread2: i is  %d\n\n", i);
		}
        pthread_mutex_unlock(&mutex);
		printf("thread2: unlock %d\n\n", __LINE__);
		sleep(1);
	}
}

  编译:

gcc test.c -o test -lpthread

逻辑:

主函数 创建 两个线程 1,2

线程1:累加 i ,每次都互斥锁 当i 是3的倍数的时候 发送 改变条件信号给线程2 ;

线程2:当 i <6 时,不断互斥锁操作,当 不是3的倍数的时候等待 调节改变 信号,阻塞线程;

1=1时 ;

线程2:i 不 整除 3 阻塞等待 条件改变信号;
线程1:正常累加 i=2

i=2
线程2:阻塞
线程1:不整除 3 ,正常累加

i=3
线程2:阻塞
线程1:整除 ,接受到发送 的条件改变信号;
线程2 解锁,正常运行 睡一秒

i=4
线程2:i 等于四 阻塞
线程1:不整除 3 ,正常累加

i=5
线程2:i 等于四 阻塞
线程1:不整除 3 ,正常累加

i=6
线程2:接受到信号 解锁
线程1:发送信号

运行:

2222222222222 in pthread2 i is 1 222222222222222222
thread2: lock line:46 i is 1
thread2: wait 1 48

1111111111 i is 1 111111111111
thread1: lock 27
thread1: unlock 35

1111111111 i is 2 111111111111
thread1: lock 27
thread1: unlock 35

1111111111 i is 3 111111111111
thread1: lock 27
thread1:signal 1 line:29 i is 3
thread1:signal 2 31
thread1: unlock 35

thread2: wait 2 53
thread2: i is 3

thread2: unlock 57

2222222222222 in pthread2 i is 3 222222222222222222
thread2: lock line:46 i is 3
thread2: unlock 57

1111111111 i is 4 111111111111
thread1: lock 27
thread1: unlock 35

2222222222222 in pthread2 i is 4 222222222222222222
thread2: lock line:46 i is 4
thread2: wait 1 48

1111111111 i is 5 111111111111
thread1: lock 27
thread1: unlock 35

1111111111 i is 6 111111111111
thread1: lock 27
thread1:signal 1 line:29 i is 6
thread1:signal 2 31
thread1: unlock 35

thread2: wait 2 53
thread2: i is 6

thread2: unlock 57

参考链接:http://blog.csdn.net/zclongembedded/article/details/7337729

时间: 2024-12-11 23:21:54

线程中的 条件变量 pthread_cond_t的相关文章

线程同步之——条件变量

一.生产消费模型:我们可以用条件变量来实现线程之间的同步,利用一个生产消费模型具体的实现同步.生产消费模型可以简单地称为3,2,1模型(即3种关系,2个对象,1个场所),同时还需注意以下3点: 1.生产者和消费者是同步互斥关系: 2.生产者和生产者是互斥关系: 3.消费者和消费者是互斥关系. 二.条件变量的理解:线程A需要等某个条件成才能继续往下执,现在这个条件不成,线程A就阻塞等待,线程B在执过程中使这个条件成了,就唤醒线程A继续执. 在pthread库中通过条件变量(Condition Va

线程同步之条件变量使用手记

由来: 最近一直在想怎么高效率的在IO线程接收到数据时通知逻辑线程(基于线程池)工作的问题,像网络编程的服务器模型的一些模型都需要用到这个实现,下面我这里简单的罗列一个多线程的网络服务器模型 半同步/半异步(half-sync/half-async): 许多餐厅使用 半同步/半异步 模式的变体.例如,餐厅常常雇佣一个领班负责迎接顾客,并在餐厅繁忙时留意给顾客安排桌位,为等待就餐的顾客按序排队是必要的.领班由所有顾客"共享",不能被任何特定顾客占用太多时间.当顾客在一张桌子入坐后,有一个

Linux程序设计学习笔记----多线程编程之线程同步之条件变量

转载请注明出处:http://blog.csdn.net/suool/article/details/38582521. 基本概念与原理 互斥锁能够解决资源的互斥访问,但是在某些情况下,互斥并不能解决问题,比如两个线程需 要互斥的处理各自的操作,但是一个线程的操作仅仅存在一种条件成立的情况下执行,一旦错过不可再重现,由于线程间相互争夺cpu资源,因此在条件成立的时候,该线程不一定争夺到cpu而错过,导致永远得不到执行..... 因此需要某个机制来解决此问题,更重要的是,线程仅仅只有一种情况需要执

3线程同步:条件变量

1 条件变量 条件变量给多个线程提供了一个汇合的场所. 依赖的头文件 #include<pthread.h> 函数声明 定义分配条件变量 pthread_cond_t cond =PTHREAD_COND_INITIALIZER; int pthread_cond_init(pthread_cond_t*restrict cond, const pthread_condattr_t *restrict attr); 名称: pthread_cond_init 功能: initialize co

Java基础之线程新特性条件变量

条件变量都实现了java.util.concurrent.locks.Condition接口,条件变量的实例化是通过一个Lock对象上调用newCondition()方法来获取的,这样,条件就和一个锁对象绑定起来了.因此,Java中的条件变量只能和锁配合使用,来控制并发程序访问竞争资源的安全.条件变量的出现是为了更精细控制线程等待与唤醒,在Java5之前,线程的等待与唤醒依靠的是Object对象的wait()和notify()/notifyAll()方法,这样的处理不够精细 package un

在SQL存储过程中给条件变量加上单引号

在SQL存储过程中给条件变量加上单引号,不加语句就会出问题,以下就是在存储过程中将条件where设置成了动态变化的,给where赋完值再和前面的语句拼接,再execute(SQL) set @where= '(DATEDIFF(day,'''+CONVERT(varchar(100), @d_start, 23)+''',sdate)>=0 and DATEDIFF(day,'''+CONVERT(varchar(100), @d_end, 23)+''',sdate)<=0) and ' +

线程&mdash;同步之条件变量

条件变量:允许线程阻塞等待另一个线程发送信号唤醒.条件变量被用来阻塞一个线程,当条件不满足时,线程解开相应的互斥锁并等待条件发生变化.如果其他线程改变了条件变量,并且使用条件变量换型一个或多个正被此条件变量阻塞的线程.这些线程将重新锁定互斥锁并重新测试条件是否满足.条件变量被用来进行线程间的同步. thread 1 con = threading.Condition()    #创建条件变量 while True: do something con.acquire()    #获取锁 con.n

线程中的条件和定时器

1.线程中的条件 # 条件 # acquire release # wait # notify # 一个条件被创建之初,类似默认有一个False状态,False状态会影响wait,使wait一直处于等待状态 # notify(int数据类型). 造钥匙,当条件对象notify了,条件对象的wait就会解除阻塞,notify传递的参数是几,条件对象的wait就会解除几次阻塞 import time from threading import Condition # 导入线程条件模块 from th

线程同步(条件变量、信号量)以及死锁

死锁:指两个或两个以上进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待现象,若无外力作用,它们都将无法继续推进下去. 例:交叉死锁:线程1获得了锁1,线程2获得了锁2,此时线程1调用lock想获得锁2,需挂起等待线程2释放锁2,而线程2也想获得锁1,也需挂起等待线程1释放锁1,此时两个线程都挂起等待 产生死锁的四个必要条件: (1):互斥条件(一个资源每次只能被一个进程或线程使用) (2):请求与保持条件(一个进程或线程因请求资源而阻塞时,对已获得的资源不释放) (3):不剥夺条件(此