C++实现-用三个线程分别打印’A’、’B’、’C’,线程1打印A,线程2打印B,线程3打印C,请实现三个线程同时启动并协作始终打印 ABCABCABC….

本文探讨了如何利用多线程技术,在确保线程安全的前提下,实现三个线程的协作打印ABCABC...的循环字符串。通过两种方法实现:一是使用互斥量配合标记变量;二是运用条件变量结合互斥锁,确保线程按指定顺序执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目为:用三个线程分别打印’A’、’B’、’C’,线程1打印A,线程2打印B,线程3打印C,请实现三个线程同时启动并协作始终打印 ABCABCABC….,是在牛客网上看到的阿里一面的题目。
首先要实现轮次有序打印ABC,就必须让线程1先执行,然后再让线程2执行,最后再让线程3执行,最后再回到线程1,以此循环往复。所以就需要保证线程的执行顺序,且单个线程在执行的时候,不能受到其他两个线程的干扰,那比较容易想到采用锁。
那肯定不能单纯的让三个线程去竞争锁,因为无法保证线程1首先拿到锁,再到线程2和线程3,所以需要有个flag来标记。下面先看

第一种实现方法,单纯使用互斥量+一个标记

#include <iostream>
#include <pthread.h>
using namespace std;
  
pthread_mutex_t mymutex;  //互斥量
int ct = 1;  //全局变量计数
  
void* thread1(void* arg){  //线程1打印'A'
    while(1){
        pthread_mutex_trylock(&mymutex);
        while(ct == 1){ 
            cout << 'A';
            ++ct;
        }   
        pthread_mutex_unlock(&mymutex);
    }   
}

void* thread2(void* arg){  //线程2打印'B'
      while(1){
          pthread_mutex_trylock(&mymutex);
          while(ct == 2){
              cout << 'B';
              ++ct;
          }
          pthread_mutex_unlock(&mymutex);
      }
  }
  
void* thread3(void* arg){ //线程3打印'C'
      while(1){
          pthread_mutex_trylock(&mymutex);
          while(ct == 3){
              cout << 'C' << ' ';
              ct = 1;  //重置ct
          }
          pthread_mutex_unlock(&mymutex); 
      }
  }

int main(){
    pthread_t t1;    
    pthread_t t2;    
    pthread_t t3;
    pthread_mutex_init(&mymutex, NULL);
  
    pthread_create(&t1,NULL,thread1,NULL);
    pthread_create(&t2,NULL,thread2,NULL);
    pthread_create(&t3,NULL,thread3,NULL);
  
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    pthread_join(t3, NULL);
  
    return 0;
}   

为了呈现效果更清晰,用一个空格隔开)

第二种实现方法,采用条件变量 + 互斥锁

#include <iostream>
#include <pthread.h>
using namespace std;
  
pthread_cond_t mycond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mymutex;
int ct = 0;
  
void* mythread1(void *arg){
    while(1){
        pthread_mutex_lock(&mymutex);
        while(ct % 3 != 0){ 
            pthread_cond_wait(&mycond, &mymutex); //还没轮到,继续等待
        }   
        cout << 'A';
        ++ct;
        pthread_mutex_unlock(&mymutex);
        pthread_cond_broadcast(&mycond);
    }   
}

void* mythread2(void *arg2){
    while(1){
        pthread_mutex_lock(&mymutex);
        while(ct % 3 != 1){ 
            pthread_cond_wait(&mycond, &mymutex);
        }   
        cout << 'B';
        ++ct;
        pthread_mutex_unlock(&mymutex);
        pthread_cond_broadcast(&mycond);
    }
}
  
void* mythread3(void *arg3){
    while(1){
        pthread_mutex_lock(&mymutex);
        while(ct % 3 != 2){
            pthread_cond_wait(&mycond, &mymutex);
        }
        cout << 'C' << endl;
        ++ct;
        pthread_mutex_unlock(&mymutex);
        pthread_cond_broadcast(&mycond);            
    }
}
int main(){
    pthread_mutex_init(&mymutex, NULL);
    pthread_t t1;
    pthread_t t2;
    pthread_t t3;
  
    pthread_create(&t1, NULL, mythread1, NULL);
    pthread_create(&t2, NULL, mythread2, NULL);
    pthread_create(&t3, NULL, mythread3, NULL);
  
    pthread_join(t1,NULL);
    pthread_join(t2,NULL);
    pthread_join(t3,NULL);
  
    return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值