关闭

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

588人阅读 评论(0) 收藏 举报
分类:

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/

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:49891次
    • 积分:743
    • 等级:
    • 排名:千里之外
    • 原创:27篇
    • 转载:1篇
    • 译文:0篇
    • 评论:4条
    文章分类
    最新评论