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 }
  • 相关阅读:
    js设置奇偶行数样式
    c#简单的调试信息、日志信息输出
    调用接口
    sql日期转换格式
    .net 常用方法
    日常验证
    Js 返回页面 or 跳转页面
    .NET Core Kestrel部署HTTPS以及Docker部署HTTPS
    Linux openssl生成证书
    ASP.NET Core中使用AutoMapper实现自动转化
  • 原文地址:https://www.cnblogs.com/--lr/p/11247753.html
Copyright © 2011-2022 走看看