Linux线程同步之条件变量

条件变量是线程可用的另一种同步机制。条件变量给多个线程提供了一个会合的场所。条件本身是由互斥量保护的。线程在改变 条件状态前必须首先锁住互斥量。

  条件变量的初始化 pthread_cond_init

  去除初始化 pthread_cond_destroy

  等待 pthread_cond_wait

  满足条件给向进程发送信号 pthread_cond_signal

  下面程序展示了利用条件变量等待另外两个线程满足条件时,第三个进程继续向前执行


#include <stdio.h>

#include <pthread.h>

#include <signal.h>

pthread_mutex_t m1, m2;

pthread_cond_t c1,c2;

pthread_t t1, t2, t3;

void* r1(void *arg)

{

sleep(10); //睡眠10秒

pthread_cond_signal(&c1);

printf("t1 finish\n");

while(1);

}

void* r2(void *arg)

{

sleep(15);//睡眠15秒

pthread_cond_signal(&c2);

printf("t2 finish\n");

while(1);

}

void* r3(void *arg)

{

pthread_cond_wait(&c1, &m1);

pthread_cond_wait(&c2, &m2);

printf("finish\n");//15秒后线程打印

}

main()

{

pthread_mutex_init(&m1, 0);

pthread_mutex_init(&m2, 0);

pthread_cond_init(&c1, 0);

pthread_cond_init(&c2, 0);

pthread_create(&t1, 0, r1, 0);

pthread_create(&t2, 0, r2, 0);

pthread_create(&t3, 0, r3, 0);

while(1);

}

  执行结果

  条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。

  下面程序中,由于在互斥量中等待条件会造成死锁


#include <pthread.h>

#include <stdio.h>

#include <signal.h>

pthread_t t1,t2;

pthread_mutex_t m1,m2;

pthread_cond_t c;

void *r1(void *d)

{

while(1)

{

pthread_mutex_lock(&m1);

printf("wait\n");

pthread_cond_wait(&c,&m2);

pthread_mutex_unlock(&m1);

}

}

void *r2(void *d)

{

while(1)

{

pthread_mutex_lock(&m1);

printf("signal\n");

pthread_cond_signal(&c);

pthread_mutex_unlock(&m1);

}

}

main()

{

pthread_cond_init(&c,0);

pthread_mutex_init(&m1,0);

pthread_mutex_init(&m2,0);

pthread_create(&t1,0,r1,0);

pthread_create(&t2,0,r2,0);

while(1);

/*

pthread_join(t1,0);

pthread_join(t2,0);

pthread_mutex_destroy(&m2);

pthread_mutex_destroy(&m1);

pthread_cond_destroy(&c);*/

}

  执行结果,程序执行到某一时刻发生死锁,不再向下执行

  改进后的程序,允许线程以无竞争的方式等待,不会发生死锁


#include <pthread.h>

#include <stdio.h>

#include <signal.h>

pthread_t t1,t2;

pthread_mutex_t m1,m2;

pthread_cond_t c;

void *r1(void *d)

{

while(1)

{

pthread_mutex_lock(&m1);

printf("wait\n");

pthread_cond_wait(&c,&m1);

pthread_mutex_unlock(&m1);

}

}

void *r2(void *d)

{

while(1)

{

pthread_mutex_lock(&m1);

printf("signal\n");

pthread_cond_signal(&c);

pthread_mutex_unlock(&m1);

}

}

main()

{

pthread_cond_init(&c,0);

pthread_mutex_init(&m1,0);

pthread_mutex_init(&m2,0);

pthread_create(&t1,0,r1,0);

pthread_create(&t2,0,r2,0);

while(1);

/*

pthread_join(t1,0);

pthread_join(t2,0);

pthread_mutex_destroy(&m2);

pthread_mutex_destroy(&m1);

pthread_cond_destroy(&c);*/

}

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-11-10 00:53:10

Linux线程同步之条件变量的相关文章

UNIX环境高级编程:线程同步之条件变量及属性

条件变量变量也是出自POSIX线程标准,另一种线程同步机制.主要用来等待某个条件的发生.可以用来同步同一进程中的各个线程.当然如果一个条件变量存放在多个进程共享的某个内存区中,那么还可以通过条件变量来进行进程间的同步. 每个条件变量总是和一个互斥量相关联,条件本身是由互斥量保护的,线程在改变条件状态之间必须要锁住互斥量.条件变量相对于互斥量最大的优点在于允许线程以无竞争的方式等待条件的发生.当一个线程获得互斥锁后,发现自己需要等待某个条件变为真,如果是这样,该线程就可以等待在某个条件上,这样就不

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 c

二、(LINUX 线程同步) 互斥量、条件变量以及生产者消费者问题

原创转载请注明出处: 接上一篇: 一.(LINUX 线程同步) 引入  http://blog.itpub.net/7728585/viewspace-2137980/ 在线程同步中我们经常会使用到mutex互斥量,其作用用于保护一块临界区,避免多线程并发操作对这片临界区带来的数据混乱, POSIX的互斥量是一种建议锁,因为如果不使用互斥量也可以访问共享数据,但是可能是不安全的. 其原语包含: pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 

Linux线程同步之递归锁

概述 最常见的进程/线程的同步方法有互斥锁(或称互斥量Mutex),读写锁(rdlock),条件变量(cond),信号量(Semophore)等.在Windows系统中,临界区(Critical Section)和事件对象(Event)也是常用的同步方法. 简单的说,互斥锁保护了一个临界区,在这个临界区中,一次最多只能进入一个线程.如果有多个进程在同一个临界区内活动,就有可能产生竞态条件(race condition)导致错误. 读写锁从广义的逻辑上讲,也可以认为是一种共享版的互斥锁.如果对一个

一、(LINUX 线程同步) 引入

原创水平有限有误请指出 线程相比进程有着先天的数据共享的优势,如下图,线程共享了进程除栈区以外的所有内存区域如下图所示: 但是这种共享有时候也会带来问题,简单的考虑如下C++代码: 点击(此处)折叠或打开 /*************************************************************************   > File Name: error.cpp   > Author: gaopeng QQ:22389860 all right rese

Linux线程同步之信号C语言实例_C 语言

linux中向某个线程发送信号,若没有对该信号的处理函数,则会导致程序结束. 如下面的程序,创建一个线程,主线程向其发送一个信号,会导致程序立即结束 #include <stdio.h> #include <pthread.h> pthread_t t; void* run(void* arg) { while(1) { printf("Hello\n"); } } main() { pthread_create(&t, 0, run, 0); pthr

嵌入式 Linux线程同步读写锁rwlock示例

读写锁比mutex有更高的适用性,可以多个线程同时占用读模式的读写锁,但是只能一个线程占用写模式的读写锁.1. 当读写锁是写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞:2. 当读写锁在读加锁状态时,所有试图以读模式对它进行加锁的线程都可以得到访问权,但是以写模式对它进行枷锁的线程将阻塞:3. 当读写锁在读模式锁状态时,如果有另外线程试图以写模式加锁,读写锁通常会阻塞随后的读模式锁请求,这样可以避免读模式锁长期占用,而等待的写模式锁请求长期阻塞:这种锁适用对数据结构进行读

并发编程(一): POSIX 使用互斥量和条件变量实现生产者/消费者问题

    boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t和pthread_cond_t的一系列的封装.因此通过对原生态的POSIX 的mutex,cond的生成者,消费者的实现,我们可以再次体会boost带给我们的便利. 1. 什么是互斥量        互斥量从本质上说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁.对互斥量进行加锁以后,任何其他试图再次对互斥量加锁的线程将

Linux线程管理必备:解析互斥量与条件变量的详解_C 语言

   做过稍微大一点项目的人都知道,力求程序的稳定性和调度的方便,使用了大量的线程,几乎每个模块都有一个专门的线程处理函数.而互斥量与条件变量在线程管理中必不可少,任务间的调度几乎都是由互斥量与条件变量控制.互斥量的实现与进程中的信号量(无名信号量)是类似的,当然,信号量也可以用于线程,区别在于初始化的时候,其本质都是P/V操作.编译时,记得加上-lpthread或-lrt哦.    有关进程间通信(消息队列)见:进程间通信之深入消息队列的详解 一.互斥量 1. 初始化与销毁:    对于静态分