题目为:用三个线程分别打印’A’、’B’、’C’,线程1打印A,线程2打印B,线程3打印C,请实现三个线程同时启动并协作始终打印 ABCABCABC….,是在牛客网上看到的阿里一面的题目。
首先要实现轮次有序打印ABC,就必须让线程1先执行,然后再让线程2执行,最后再让线程3执行,最后再回到线程1,以此循环往复。所以就需要保证线程的执行顺序,且单个线程在执行的时候,不能受到其他两个线程的干扰,那比较容易想到采用锁。
那肯定不能单纯的让三个线程去竞争锁,因为无法保证线程1首先拿到锁,再到线程2和线程3,所以需要有个flag来标记。下面先看
第一种实现方法,单纯使用互斥量+一个标记
#include
#include 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
#include 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;
}
【多线程|C++实现-用三个线程分别打印’A’、’B’、’C’,线程1打印A,线程2打印B,线程3打印C,请实现三个线程同时启动并协作始终打印 ABCABCABC….】
文章图片
推荐阅读
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- C/C++|C/C++ basis 02
- Qt实战|Qt+OpenCV联合开发(二十一)--图像翻转与旋转
- 代码狂魔|实战证明java中的两把锁ReentrantLock与synchronized的系统调用
- Qt实战|Qt+OpenCV联合开发(十四)--图像感兴趣区域(ROI)的提取
- Qt实战|Qt+OpenCV联合开发(十三)--通道分离与合并
- opencv|Qt+OpenCV联合开发(十六)--图像几何形状绘制
- Qt实战|Qt+OpenCV联合开发(十七)--随机数与随机颜色
- 进程通信方式