Linux多线程编程入门-同步机制-条件变量
来源:互联网 发布:用友网络2016中报 编辑:程序博客网 时间:2024/03/29 07:13
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多线程编程入门-同步机制-条件变量
- linux多线程-----同步机制(互斥量、读写锁、条件变量)
- linux多线程编程入门-同步机制-互斥量
- Linux多线程编程入门-同步机制-信号量
- Linux多线程编程之同步对象编程:条件变量
- 【Linux多线程同步】条件变量
- Linux 同步机制:条件变量
- Linux多线程编程(二)线程同步之条件变量
- Linux线程编程 - 线程同步机制之条件变量
- Linux多线程编程-条件变量
- linux多线程编程---条件变量
- Linux多线程编程-条件变量
- Linux多线程编程---条件变量
- python多线程编程(5): 条件变量同步
- python多线程编程: 条件变量同步
- python多线程编程(5): 条件变量同步
- python多线程编程(5): 条件变量同步
- python多线程编程(5): 条件变量同步
- 基于visual Studio2013解决C语言竞赛题之0509杨辉三角
- 设计模式之外观模式见解
- uva 562 Dividing coins
- android:configChanges属性
- smali文件内容具体介绍
- Linux多线程编程入门-同步机制-条件变量
- linux内核启动流程分析
- Ubuntu 安装中文输入法
- DB2新建实例
- cocos2d-x3.0游戏示例SimpleGame中的一个小问题
- CALTECH 101 RESULTS
- JavaScript中的匿名函数及函数的闭包
- [转]Spring Resource loader with GetResource() example
- MTP in Android