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/

原创粉丝点击