条件锁即在一定条件下触发,那什么时候适合用条件锁呢,那当然是你在等待一个符合的条件下触发。一个常用的例子就是在线程中无限循环执行一个操作,但是这个操作并不是需要 一直执行而是在满足一定条件下执行。例如:

int changed = 0;

static pthread_mutext_t mtx = PTHREAD_MUTEX_INITALIZER;

static pthread_cond_t cond = PTHREAD_COND_INITALIZER;

void* thread_fun(void* argc)

{

while(true)

{

if(changed)

{

printf("i am changed");

}else

{

//方法一

sleep(1);

//方法二

pthread_mutex_lock(&mtx);

pthread_cond_wait(&cond,&mtx);

pthread_mutex_unloc(&mtx);

}

}

}

void main()

{

pthread_t threadId;

pthread_create(&threadId,NULL,thread_fun,NULL);

sleep(10);

changed = 1;

//方法二

pthread_cond_signal(&cond);

}

从上面的例子可以看出当changed变量为1的时候才执行操作,其他时间不执行,如果使用sleep函数,那么将会出现执行不及时的现象,如果使用条件锁的话那么会在条件改变的时候立即执行,效果比较好。

那如果使用条件锁呢?

首先是条件锁的创建,条件锁创建有两种方法,一种是静态方法,既使用静态变量的方式:

static pthread_cond_t cond = PTHREAD_COND_INITALIZER;

另外一种是动态的方法:

pthread_cond_init(pthread_cond_t *cv,const pthread_condattr_t *cattr);

其次是等待: pthread_cond_wait,此方法可以加超时的时间,如果没有超时的时间则是一直等待。

再次是触发:当达到条件之后使用 pthread_cond_signal通知

但是在多线程里面必须要配合互斥锁,因为在多线程的条件下如果不使用互斥锁,那么就有可能同时多个执行ptread_cond_wait会造成混乱。

转载于:https://my.oschina.net/u/1013544/blog/1788088

Linux 开发之线程条件锁那些事的更多相关文章

  1. Linux Posix线程条件变量

    生产者消费者模型 .多个线程操作全局变量n,需要做成临界区(要加锁--线程锁或者信号量) .调用函数pthread_cond_wait(&g_cond,&g_mutex)让这个线程锁在 ...

  2. Linux下c开发 之 线程通信(转)

    Linux下c开发 之 线程通信(转) 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linu ...

  3. Linux下c开发 之 线程通信

    Linux下c开发 之 线程通信 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linux本身 ...

  4. python线程condition条件锁应用实例

    import time import threading # 吃火锅鱼丸 guo = [] suo = threading.Condition() #条件锁 # 生产者负责生产 class Produ ...

  5. 【Linux开发】编写属于你的第一个Linux内核模块

    曾经多少次想要在内核游荡?曾经多少次茫然不知方向?你不要再对着它迷惘,让我们指引你走向前方-- 内核编程常常看起来像是黑魔法,而在亚瑟 C 克拉克的眼中,它八成就是了.Linux内核和它的用户空间是大 ...

  6. Linux 内核同步之自旋锁与信号量的异同【转】

    转自:http://blog.csdn.net/liuxd3000/article/details/8567070 Linux 设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发访问会导 ...

  7. Python之路(第四十四篇)线程同步锁、死锁、递归锁、信号量

    在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十分棘手的问题,也是使用多线程下面临的问题,如果处理不好,会带来较严重的后果,使用python多线程中提供Lock ...

  8. 嵌入式Linux开发系列之一: 走进嵌入式Linux的世界

    转载:http://www.ibm.com/developerworks/cn/linux/l-embed/part1/index.html   随着信息化技术的发展和数字化产品的普及,以计算机技术. ...

  9. Linux查看进程线程个数

    1.根据进程号进行查询: # pstree -p 进程号 # top -Hp 进程号 2.根据进程名字进行查询: # pstree -p `ps -e | grep server | awk '{pr ...

随机推荐

  1. python开发基于SMTP协议的邮件代发服务

    写在这篇文章前照例给大家灌输点名词解释,理论知识,当然已经很熟悉的同学可以往下翻直接看干货 1. 什么是SMTP SMTP即简单传输协议(Simple Mail Transfer Protocol), ...

  2. springboot-mybatis-oracle学习笔记

    前言 最近公司的项目是基于 oracle 数据库的,这里记录下 springboot+mybatis+oracle 的踩坑过程. 开发前准备 环境参数 开发工具:IDEA 基础工具:Maven+JDK ...

  3. 谁给你说的 Ubuntu 不可以输入中文

    文章更新于:2020-04-04 按照惯例,需要的文件附上链接放在文首 文件名:sogoupinyin_2.3.1.0112_amd64.deb 文件大小:25.5 MB 下载链接:https://w ...

  4. scrapy中使用selenium来爬取页面

    scrapy中使用selenium来爬取页面 from selenium import webdriver from scrapy.http.response.html import HtmlResp ...

  5. Matlab入门(一)

    1.常用命令 cd 显示或改变当前工作目录 load 加载指定文件的变量 dir 显示当前目录或指定目录下的文件 diary 日志文件命令 clc 清除工作窗中的所有显示内容 ! 调用 DOS 命令 ...

  6. VSCode设置大小写转换的快捷键

    本文已同步到专业技术网站 www.sufaith.com, 该网站专注于前后端开发技术与经验分享, 包含Web开发.Nodejs.Python.Linux.IT资讯等板块. VSCode在默认情况下没 ...

  7. python--->相对和绝对路径

    绝对路径(absolute path):从根开始找 eg:c:\file\01.txt 相对路径(relative path):相对当前文件内找 ../      # 当前文件的上一级 os.path ...

  8. Python爬虫系列(六):搜索文档树

    今天早上,写的东西掉了.这个烂知乎,有bug,说了自动保存草稿,其实并没有保存.无语 今晚,我们将继续讨论如何分析html文档. 1.字符串 #直接找元素soup.find_all('b') 2.正则 ...

  9. Python设计模式(1)-简单工厂模式

    为操作数据库设计增删改查操作 # coding=utf-8class DbManager: def __init__(self): pass def operate_db(self): pass cl ...

  10. 支持向量机SVM推导

    样本(\(x_{i}\),\(y_{i}\))个数为\(m\): \[\{x_{1},x_{2},x_{3}...x_{m}\} \] \[\{y_{1},y_{2},y_{3}...y_{m}\} ...