• Linux 多线程编程 实例 2


    编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。

    使用条件变量来实现:

    复制代码
     1 #include <pthread.h>
     2 #include <stdio.h>
     3 #include <unistd.h>
     4 static pthread_mutex_t mtx=PTHREAD_MUTEX_INITIALIZER;
     5 
     6 static pthread_cond_t condA ;
     7 static pthread_cond_t condB ;
     8 static pthread_cond_t condC ;
     9 
    10 
    11 void* threadA(void *arg)
    12 {
    13 int a =10;
    14 while(a--)
    15 {
    16 //sleep(2);
    17 //printf("A begin.
    ");
    18 pthread_mutex_lock(&mtx);
    19 //printf("A wait.
    ");
    20 pthread_cond_wait(&condC,&mtx);
    21 printf("A.
    ");
    22 pthread_mutex_unlock(&mtx);
    23 pthread_cond_signal(&condA);
    24 }
    25 }
    26 
    27 void* threadB(void *arg)
    28 {
    29 int b=10;
    30 while(b--)
    31 {
    32 //sleep(2);
    33 //printf("B begin.
    ");
    34 pthread_mutex_lock(&mtx);
    35 //printf("B wait.
    ");
    36 pthread_cond_wait(&condA,&mtx);
    37 printf("B.
    ");
    38 pthread_mutex_unlock(&mtx);
    39 pthread_cond_signal(&condB);
    40 }
    41 }
    42 
    43 void* threadC(void *arg)
    44 
    45 {
    46 int c=10;
    47 while(c--)
    48 {
    49 //sleep(2);
    50 //printf("C begin.
    ");
    51 pthread_mutex_lock(&mtx);
    52 //printf("C wait.
    ");
    53 pthread_cond_wait(&condB,&mtx);
    54 printf("C.
    ");
    55 pthread_mutex_unlock(&mtx);
    56 pthread_cond_signal(&condC);
    57 }
    58 }
    59 int main (void *arg)
    60 {
    61 pthread_t tidA;
    62 pthread_t tidB;
    63 pthread_t tidC;
    64 pthread_cond_init(&condA,NULL);
    65 pthread_cond_init(&condB,NULL);
    66 pthread_cond_init(&condC,NULL);
    67 pthread_create(&tidA,NULL,&threadA,NULL);
    68 pthread_create(&tidB,NULL,&threadB,NULL);
    69 pthread_create(&tidC,NULL,&threadC,NULL);
    70 
    71 printf("main begin..
    ");
    72 sleep(4);
    73 pthread_cond_signal(&condC);
    74 
    75 pthread_join(tidA,NULL);
    76 pthread_join(tidB,NULL);
    77 pthread_join(tidC,NULL);
    78 
    79 return 0;
    80 }
    复制代码
  • 相关阅读:
    BZOJ4779: [Usaco2017 Open]Bovine Genomics
    USACO比赛题泛刷
    BZOJ1977: [BeiJing2010组队]次小生成树 Tree
    LOJ #10132. 「一本通 4.4 例 3」异象石
    $O(n+log(mod))$求乘法逆元的方法
    BZOJ2226: [Spoj 5971] LCMSum
    数据库 | Redis 缓存雪崩解决方案
    中间件 | 微服务架构
    数据库 | SQL 诊断优化套路包,套路用的对,速度升百倍
    数据库 | SQL语法优化方法及实例详解
  • 原文地址:https://www.cnblogs.com/xieyulin/p/7070701.html
Copyright © 2020-2023  润新知