条件变量用于线程之间的通信,和互斥锁一起使用。条件变量用于及时通知等待的线程条件的变化,使线程不至于错过变化。

考虑下面的情况,有AB两个线程对index这个全局变量进行++,一个线程C用于判断,index是不是3的倍数,如果是就输出除以3的结果。

根据时间片轮转的算法,线程应该是这样执行的。

Index初值为1.

A B C (此时index=3,输出)A B C(此时index=5,不输出) A(此时index=6,c还在队列的最后,错过)BC 。。。。

我们能看出,C会每隔一段时间就错个一个。

如图:

因为三个线程的优先级一样,不存在抢占,而且CPU是把时间片分给每个线程的,所以C的错过是必然的。

所以引入了条件变量。

C线程调用pthread_cond_wait(cond,lock)函数来感知变化。

代码:

#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <stdio.h>
#include<fcntl.h>
#include <pthread.h>
#include <errno.h> int index = ; pthread_mutex_t lock;
pthread_cond_t cond; void fun1(void){ while(index<){ pthread_mutex_lock(&lock);
index++;
printf("In fun1 : %d\n",index);
pthread_cond_signal(&cond);//当有变化后,使用signal通知wait函数
pthread_mutex_unlock(&lock);
usleep(0.1); } } void fun3(void){ while(index<){ pthread_mutex_lock(&lock);
index++;
printf("In fun1 : %d\n",index);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&lock);
usleep(0.1); } } void fun2(void){ int i=; while(i<){ pthread_mutex_lock(&lock); while(index%!=){ pthread_cond_wait(&cond,&lock);//如果获得了互斥锁,但是条件不合适的话,wait会释放锁,不往下执行。当变化后,条件合适,将直接获得锁。 } //if(index%3==0)
printf("%d\n",index/);
//else
//printf("no\n");
i++; pthread_mutex_unlock(&lock); usleep(0.1); } } int main(){ pthread_mutex_init(&lock,NULL);
pthread_cond_init(&cond,NULL); pthread_t tid1,tid2,tid3;
pthread_create(&tid1,NULL,(void*)fun1,NULL);
pthread_create(&tid2,NULL,(void*)fun2,NULL);
pthread_create(&tid3,NULL,(void*)fun3,NULL); pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
pthread_join(tid3,NULL); }

linux条件变量的更多相关文章

  1. 理解 Linux 条件变量

    理解 Linux 条件变量 1 简介 当多个线程之间因为存在某种依赖关系,导致只有当某个条件存在时,才可以执行某个线程,此时条件变量(pthread_cond_t)可以派上用场.比如: 例1: 当系统 ...

  2. linux 条件变量与线程池

    条件变量Condition Variables 概述 1. 条件变量提供了另外一种线程同步的方式.如果没有条件变量,程序需要使用线程连续轮询(可能在临界区critical section内)方式检查条 ...

  3. linux 条件变量

    互斥量就是一把锁,在访问数据时能保证同一时间内只有一个线程访问数据,在访问完以后再释放互斥量上的锁. 条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条 ...

  4. linux条件变量使用和与信号量的区别

    近来在项目中用到条件变量和信号量做同步时,这一块一直都有了解,但也一直没有总结,这次总结一下,给大家提供点参考,也给自己留点纪念. 首先,关于信号量和条件变量的概念可以自行查看APUE,我这直接把AP ...

  5. Linux 条件变量函数signal和wait补充

    pthread_cond_wait必须放在pthread_mutex_lock和pthread_mutex_unlock之间,因为他要根据共享变量的状态来觉得是否要等待,而为了不永远等待下去所以必须要 ...

  6. 转载~kxcfzyk:Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解

    Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解   多线程c语言linuxsemaphore条件变量 (本文的读者定位是了解Pthread常用多线程API和Pthread互斥锁 ...

  7. [转]一个简单的Linux多线程例子 带你洞悉互斥量 信号量 条件变量编程

    一个简单的Linux多线程例子 带你洞悉互斥量 信号量 条件变量编程 希望此文能给初学多线程编程的朋友带来帮助,也希望牛人多多指出错误. 另外感谢以下链接的作者给予,给我的学习带来了很大帮助 http ...

  8. linux多线程-互斥&条件变量与同步

    多线程代码问题描述 我们都知道,进程是操作系统对运行程序资源分配的基本单位,而线程是程序逻辑,调用的基本单位.在多线程的程序中,多个线程共享临界区资源,那么就会有问题: 比如 #include < ...

  9. linux多线程同步pthread_cond_XXX条件变量的理解

    在linux多线程编程中,线程的执行顺序是不可预知的,但是有时候由于某些需求,需要多个线程在启动时按照一定的顺序执行,虽然可以使用一些比较简陋的做法,例如:如果有3个线程 ABC,要求执行顺序是A-- ...

随机推荐

  1. phpcms tag页调用缩略图

    \phpcms\modules\content\tag.php 找到: 'title, description, url, inputtime, style' 改成:'title, thumb, de ...

  2. SLIP 协议

    SLIP 协议 SLIP 英文原义:Serial Line Internet Protocol 中文释义:串行线路网际协议 注解:该协议是Windows远程访问的一种旧工业标准,主要在Unix远程访问 ...

  3. BZOJ1014 JSOI2008 火星人prefix 【非旋转Treap】*

    BZOJ1014 JSOI2008 火星人prefix Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符 ...

  4. 在MEF中实现延迟加载部件(转)

    在MEF的宿主中,当我们通过Import声明导入的对象时,组装(Compose)的时候会创建该对象.例如: interface ILogger    {        void Log(string  ...

  5. 【转】如何将FLAC格式转为MP3格式

    原文网址:http://jingyan.baidu.com/ae/3aed632e65708470108091ca.html FLAC全称为无损音频压缩编码,FLAC格式又称无损格式 不会破坏原有的音 ...

  6. (转)Android性能优化——工具篇

    Android性能优化是Android开发中经常遇见的一个问题,接下来将对Android性能优化方面的知识点做一个简单的梳理和总结,将从工具和代码两方面进行梳理.所谓工欲善其事必先利其器,本文首先来看 ...

  7. 初探babel转换器的安装与使用

    一.配置.babelrc文件(没有名字的文件) Babel的配置文件是.babelrc,存放在项目的根目录下.使用Babel的第一步,就是配置这个文件. 基本格式如下: { "presets ...

  8. Python——基础数据类型(补充)

    1.基础数据类型汇总补充 (1)小数据池:   为了节省空间,数字和字符串有,其他的没有[了解]   数字:-5---256之间的数字共用一个内存地址 #(1)i1 = i2 id(i1) == id ...

  9. JVM内存管理之垃圾搜集器精解(让你在垃圾搜集器的世界里耍的游刃有余)

    引言 在上一章我们已经探讨过hotspot上垃圾搜集器的实现,一共有六种实现六种组合.本次LZ与各位一起探讨下这六种搜集器各自的威力以及组合的威力如何. 为了方便各位的观看与对比,LZ决定采用当初写设 ...

  10. Netty--Google Protobuf编解码

    Google Protobuf是一种轻便高效的结构化数据存储格式,可以用于结构化数据序列化.它很适合做数据存储或 RPC 数据交换格式.可用于通讯协议.数据存储等领域的语言无关.平台无关.可扩展的序列 ...