Linux多线程编程入门-同步机制-条件变量

原创 2013年12月04日 14:56:21

Linux平台上触发条件变量则自动复位。

条件变量的置位和复位有两种常用模型:第一种模型是当条件变量置位(signaled)以后,如果当前没有线程在等待,其状态会保持为置位(signaled),直到有等待的线程进入被触发,其状态才会变为复位(unsignaled),这种模型的采用以 Windows 平台上的 Auto-set Event 为代表。其状态变化如图 1 所示:



第二种模型则是 Linux 平台的 Pthread 所采用的模型,当条件变量置位(signaled)以后,即使当前没有任何线程在等待,其状态也会恢复为复位(unsignaled)状态。其状态变化如图 2 所示:



具体来说,Linux 平台上 Pthread 下的条件变量状态变化模型是这样工作的:调用 pthread_cond_signal() 释放被条件阻塞的线程时,无论存不存在被阻塞的线程,条件都将被重新复位,下一个被条件阻塞的线程将不受影响。而对于 Windows,当调用 SetEvent 触发 Auto-reset 的 Event 条件时,如果没有被条件阻塞的线程,那么条件将维持在触发状态,直到有新的线程被条件阻塞并被释放为止。

这种差异性对于那些熟悉 Windows 平台上的条件变量状态模型而要开发 Linux 平台上多线程的程序员来说可能会造成意想不到的尴尬结果。试想要实现一个旅客坐出租车的程序:旅客在路边等出租车,调用条件等待。出租车来了,将触发条件,旅客停止等待并上车。一个出租车只能搭载一波乘客,于是我们使用单一触发的条件变量。这个实现逻辑在第一个模型下即使出租车先到,也不会有什么问题,其过程如下。


采用linux条件变量模型的出租车实例流程。


采用windows条件变量模型的出租车实例流程。



代码如下:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
#include <iostream>
using namespace std;
pthread_mutex_t taxiMutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t taxiCond = PTHREAD_COND_INITIALIZER;
void * traveler_arrive(void * name) {
	cout << "Traveler: " << (char*)name << " needs a taxi now " << endl;
	pthread_mutex_lock(&taxiMutex);
	pthread_cond_wait(&taxiCond, &taxiMutex);
	pthread_mutex_unlock(&taxiMutex);
	cout << "Traveler: " << (char*)name << " now got a taxi." << endl;
	pthread_exit((void*)0);
}

void * taxi_arrive(void * name) {
	cout << " Taxi " << (char*)name << " arrives." << endl;
	pthread_cond_signal(&taxiCond);
	pthread_exit((void*)0);
}

int main() 
{	
	pthread_t thread;
	pthread_attr_t threadAttr;
	pthread_attr_init(&threadAttr);

	pthread_create(&thread, &threadAttr, taxi_arrive, (void*)(" Jack "));
	sleep(1);
	pthread_create(&thread, &threadAttr, traveler_arrive, (void*)(" Susan "));
	sleep(1);
	pthread_create(&thread, &threadAttr, taxi_arrive, (void*)(" Mike "));
	sleep(1);
	return 0;
}


运行结果如下:

Taxi Jack arrives. 
    Traveler Susan needs a taxi now! 
    Taxi Mike arrives. 
    Traveler Susan now got a taxi.



参考链接:

Linux 的多线程编程的高效开发经验http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

linux下多线程同步机制之信号量、互斥量、读写锁、条件变量

之前有写过类似的博客,这东西不用老忘,现在又有更清晰的理解了。 一、信号量 信号量最基本的两个操作就是PV操作:P()操作实现信号量减少,V()操作实现信号量的增加 信号量的值取决于信号量的类型,信号...
  • ylf13
  • ylf13
  • 2013-10-29 16:39
  • 5679

linux多线程-----同步机制(互斥量、读写锁、条件变量)

linux多线程-----同步机制(互斥量、读写锁、条件变量)

Linux 线程同步机制:互斥、读写锁、条件变量

//1.互斥 //互斥量数据类型: pthread_mutex_t mutex; //初始化互斥量: int pthread_mutex_init(ptread_mutex_t *res...

python多线程编程(5): 条件变量同步

本文转载自:http://www.cnblogs.com/holbrook/archive/2012/03/13/2394811.html 互斥锁是最简单的线程同步机制,Python提供的Condi...

python多线程编程: 条件变量同步

互斥锁是最简单的线程同步机制,Python提供的Condition对象提供了对复杂线程同步问题的支持。Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还...

Linux操作系统下的多线程编程详细解析----条件变量

Linux操作系统下的多线程编程详细解析----条件变量   1.初始化条件变量pthread_cond_init #include int pthread_cond_init(pthrea...

Linux多线程编程(三)-----生产者与消费者(条件变量,信号量)

Linux多线程编程(一):http://blog.csdn.net/llzk_/article/details/55670172 Linux多线程编程(二):http://blog.csdn.ne...
  • LLZK_
  • LLZK_
  • 2017-02-22 21:02
  • 1181

linux多线程编程--信号量和条件变量 唤醒丢失事件

关于linux下信号量和条件变量的使用,在很多地方都可以找到相关文章,信号量、条件变量、互斥锁都是线程同步原语,在平时多线程编程中只要知道一两种就可以轻松搞定,我也是这么认为的,但是今天发现,有时还是...

Linux多线程编程详细解析----条件变量 pthread_cond_t

Linux操作系统下的多线程编程详细解析----条件变量   1.初始化条件变量pthread_cond_init #include int pthread_cond_ini...

linux 多线程编程 互斥锁与条件变量

条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待 “ 条件变量的条件成立” 而挂起,另一个线程使 “条件成立 ”(给出条件成立信号),为了防止竞争,条件变量的使用总...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)