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/


相关文章
|
3月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
|
10月前
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
8月前
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
295 67
|
10月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
195 26
|
10月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
194 17
|
12月前
|
Java 程序员 调度
【JavaEE】线程创建和终止,Thread类方法,变量捕获(7000字长文)
创建线程的五种方式,Thread常见方法(守护进程.setDaemon() ,isAlive),start和run方法的区别,如何提前终止一个线程,标志位,isinterrupted,变量捕获
|
资源调度 Linux 调度
Linux C/C++之线程基础
这篇文章详细介绍了Linux下C/C++线程的基本概念、创建和管理线程的方法,以及线程同步的各种机制,并通过实例代码展示了线程同步技术的应用。
230 0
Linux C/C++之线程基础
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
214 6
|
存储 Ubuntu Linux
C语言 多线程编程(1) 初识线程和条件变量
本文档详细介绍了多线程的概念、相关命令及线程的操作方法。首先解释了线程的定义及其与进程的关系,接着对比了线程与进程的区别。随后介绍了如何在 Linux 系统中使用 `pidstat`、`top` 和 `ps` 命令查看线程信息。文档还探讨了多进程和多线程模式各自的优缺点及适用场景,并详细讲解了如何使用 POSIX 线程库创建、退出、等待和取消线程。此外,还介绍了线程分离的概念和方法,并提供了多个示例代码帮助理解。最后,深入探讨了线程间的通讯机制、互斥锁和条件变量的使用,通过具体示例展示了如何实现生产者与消费者的同步模型。
|
安全 Linux
Linux线程(十一)线程互斥锁-条件变量详解
Linux线程(十一)线程互斥锁-条件变量详解

热门文章

最新文章