迅雷笔试题:
编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
程序:
#include <pthread.h>
#include <cstdio>
const int THREAD_NUMBER = 3;
// 子线程的互斥量和条件变量
pthread_mutex_t thread_mutex[THREAD_NUMBER];
pthread_cond_t thread_cond[THREAD_NUMBER];
// 子线程是否正在等待
bool thread_wait_flag[THREAD_NUMBER];
// 标识轮到哪个子线程输出其ID
pthread_mutex_t mutex;
int thread_turn;
void *thread_func(void *arg);
int main(int argc, char **argv)
{
pthread_t tids[THREAD_NUMBER];
for (int i = 0; i < THREAD_NUMBER; ++i)
{
pthread_mutex_init(&thread_mutex[i], NULL);
pthread_cond_init(&thread_cond[i], NULL);
}
pthread_mutex_init(&mutex, NULL);
thread_turn = 0;
for (int i = 0; i < THREAD_NUMBER; ++i)
thread_wait_flag[i] = false;
for (int i = 0; i < THREAD_NUMBER; ++i)
{
pthread_create(&tids[i], NULL, thread_func, (void *)i);
}
for (int i = 0; i < THREAD_NUMBER; ++i)
{
pthread_join(tids[i], NULL);
}
printf("\n");
return 0;
}
void *thread_func(void *arg)
{
int id = (int)arg;
char ch = 'A' + id;
int count = 0;
while (true)
{
if (id == thread_turn) // 若轮到当前子线程,输出ID,发送信号
{
printf("%c", ch);
++count;
if (id == THREAD_NUMBER-1 && count == 10) // 若是第3个子线程,输出ID后,可直接退出。
break;
pthread_mutex_lock(&mutex);
++thread_turn;
thread_turn %= THREAD_NUMBER;
pthread_mutex_unlock(&mutex);
while (true)
{
pthread_mutex_lock(&thread_mutex[thread_turn]);
if (true == thread_wait_flag[thread_turn])
{
pthread_cond_signal(&thread_cond[thread_turn]);
pthread_mutex_unlock(&thread_mutex[thread_turn]);
break;
}
pthread_mutex_unlock(&thread_mutex[thread_turn]);
}
if (count == 10) // 若是第1、2个子线程,发出信号后,退出
break;
}
else // 否则,等待
{
pthread_mutex_lock(&thread_mutex[id]);
thread_wait_flag[id] = true;
pthread_cond_wait(&thread_cond[id], &thread_mutex[id]);
thread_wait_flag[id] = false;
pthread_mutex_unlock(&thread_mutex[id]);
}
}
return (void *)0;
}
分享到:
相关推荐
Linux多线程Linux多线程Linux多线程Linux多线程Linux多线程Linux多线程Linux多线程
linux多线程编程.pdf
Linux多线程服务端编程,高清无水印!~
《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...
Linux 多线程编程笔记——简单、好记、好用说明:本代码参考麦子学院魏杰老师的Linux多线程编程 视频教程,整理有参考网上的做出修改,自己也可以参考网上比较好的例程
Linux多线程服务端编程 Linux多线程服务端编程 Linux多线程服务端编程 Linux多线程服务端编程 Linux多线程服务端编程
本书主要讲述采用现代C++ 在x86-64 Linux 上编写多线程TCP 网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。这是在Linux 下以native 语言编写用户态高性能...
嵌入式软件开发技术:第5章 嵌入式Linux多线程编程.ppt
linux多线程编程 声明:本文是网上整理的资料,版权属其作者本人所有。 1 第一章 线程基础知识 2 一.什么是线程 2 二.线程的优点 2 三.线程的缺点 2 四.线程的结构 2 五.线程标识 2 六.线程的创建 3 七..线程...
Linux下的多线程编程.pdf
linux多线程教程.zip
Linux多线程服务端编程 使用muduo C++网络库_陈硕
Linux系统下的多线程编程入门.pdf Linux系统下的多线程编程入门.pdf Linux系统下的多线程编程入门.pdf Linux系统下的多线程编程入门.pdf Linux系统下的多线程编程入门.pdf Linux系统下的多线程编程入门.pdf Linux...
linux系统下建立多线程程序设计,完成UDP网络通信的发送与接收,包括总结与源代码,实测效果可见链接https://blog.csdn.net/zxp121127/article/details/78506081
linux 系统的编程的源码,对初学者很有帮助。多线程、内存、信号量等程序。
linux 多线程编程 操作系统课程设计
《Linux多线程服务端编程:使用muduo C++网络库》.(陈硕) 完整版并且带书签,对于网络编程有很好的参考价值。
linux多线程编程.