zoukankan      html  css  js  c++  java
  • 条件变量和互斥锁

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<string.h>
     4 #include<unistd.h>
     5 #include<pthread.h>
     6 #include<errno.h>
     7 #include<iostream>
     8 using namespace std;
     9 
    10 /*提示出租车到达的条件变量*/
    11 pthread_cond_t taxiCond = PTHREAD_COND_INITIALIZER;
    12 /*同步锁*/
    13 pthread_mutex_t taxiMutex = PTHREAD_MUTEX_INITIALIZER;
    14 
    15 int travelerCount = 0;
    16 
    17 void *traveler_arrive(void* name) {
    18     cout << "Travel:" << (char*)name << "need a taxi now!" << endl;
    19     pthread_mutex_lock(&taxiMutex);
    20     travelerCount++;
    21     pthread_cond_wait(&taxiCond,&taxiMutex);
    22     pthread_mutex_unlock(&taxiMutex);
    23     cout << "Traveler:" << (char*)name << "now got a taxi!" << endl;
    24     pthread_exit((void*)0);
    25 }
    26 void *taxi_arrive(void *name) {
    27     cout << "Taxi:" << (char*)name << "arrives." << endl;
    28     while (1) {
    29         pthread_mutex_lock(&taxiMutex);
    30         if (travelerCount > 0) {
    31             pthread_cond_signal(&taxiCond);
    32             pthread_mutex_unlock(&taxiMutex);
    33             break;
    34         }
    35         pthread_mutex_unlock(&taxiMutex);
    36     }
    37     pthread_exit((void*)0);
    38 }
    39 
    40 int main() {
    41     pthread_t tids[3];
    42     int iRet = pthread_create(&tids[0], NULL, taxi_arrive, (void*)(" Jack "));
    43     if (iRet) {
    44         printf("pthread_creat error: iRet = %d
    ", iRet);
    45         return iRet;
    46     }
    47     printf("Time passing by
    ");
    48     sleep(1);
    49     iRet = pthread_create(&tids[1], NULL, traveler_arrive, (void*)(" Susan "));
    50     if (iRet) {
    51         printf("pthread_creat error: iRet = %d
    ", iRet);
    52         return iRet;
    53     }
    54     printf("Time passing by
    ");
    55     iRet = pthread_create(&tids[2], NULL, taxi_arrive, (void*)(" Mike "));
    56     if (iRet) {
    57         printf("pthread_creat error: iRet = %d
    ", iRet);
    58         return iRet;
    59     }
    60     printf("Time passing by
    ");
    61     sleep(1);
    62     void *retval;
    63     for (int i = 0; i < 3; i++) {
    64         iRet = pthread_join(tids[i], &retval);
    65         if (iRet) {
    66             printf("Join error: iRet = %d
    ", iRet);
    67             return iRet;
    68         }
    69         printf("retval = %ld
    ", (long)retval);
    70     }
    71     return 0;
    72 }
  • 相关阅读:
    《构建之法》第8、9、10章 读后感
    [团队项目]SCRUM项目6.0 7.0 (新)
    [团队项目]SCRUM项目5.0
    [团队项目]SCRUM项目4.0
    [团队项目] Scrum 项目 3.0 SCRUM 流程的步骤2: Spring 计划
    [操作系统]实验三 进程调度模拟程序
    [团队项目] Scrum 项目 2.0 产品BACKLOG
    复利计算的总结
    复利/单利计算程序进度0321更新
    0312 复利计算器2.0 运行与介绍
  • 原文地址:https://www.cnblogs.com/--lr/p/11247753.html
Copyright © 2011-2022 走看看