目录
题目
解析
该题主要依靠条件量和互斥锁来实现线程之间的同步与互斥,分析主线程、线程A和线程B的任务如下:
主线程:
- 打开LCD屏和触摸屏的硬件文件,并分别存储两个文件的文件描述符,方便后面进行条件判断。
- 开启线程A和线程B。
- 定义并初始化条件量和互斥量,方便后续线程内进行上锁和挂起步骤
线程A:
- 读取触摸屏坐标,并对读取到的坐标值进行判断。
- 坐标条件判断满足后,利用pthread_cond_signal()函数接口对线程B中挂起的条件量进行唤醒操作。
线程B:
- 当flag条件不满足时,进入挂起状态,等待线程A的唤醒,再次对flag条件进行判断。
- 当flag条件满足且自身处于唤醒状态时,输出相应的字符串到终端。
代码
[code]/********************************************************************************** file name: demo.c* author : ProgramMonkey_Fly@126.com * date : 2024/05/31* function : 该案例是掌握条件量与互斥锁联合使用过程,* 在进程中使用条件量和互斥锁实现线程的同步以及临界资源的互斥访问* note : * 由于使用了线程函数接口,所以编译时需要加上-pthread* version :** CopyRight (c) 2023-2024 ProgramMonkey_Fly@126.com All Right Reseverd ** ******************************************************************************//****************************头文件*********************************************/#include #include #include #include #include #include //触摸屏#include #include #include #include #include /****************************全局变量*********************************************/volatile int flag; //临界资源,用于条件判断是否满足输出字符串int *lcd_mp; //指向LCD屏映射空间地址的指针变量int ts_fd; //触摸屏文件pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER; //定义一个互斥量pthread_cond_t cond = PTHREAD_COND_INITIALIZER; //定义一个条件量// #define DEBUG //调试代码用,开启后可看到触摸坐标/********************************************************************************** name : thread_A_task* function : 线程A的任务函数,实现对触摸屏坐标的判断以及条件唤醒线程B* param : * none* * retval : none* author : ProgramMonkey_Fly@126.com * date : 2024/05/31* note : 由于线程B处于挂起状态,所以一定要在线程A中设定条件对线程B进行唤醒,防止* 死锁情况出现* version :* * *****************************************************************************/void *thread_A_task(void *arg){ //定义触摸屏参数变量 struct input_event ts_event; //定义一个变量,用于判断坐标是否读取完整 int cnt = 0; //定义两个变量,分别存触摸屏横坐标与纵坐标 int x = -1, y = -1; //循环判断触摸屏坐标是否满足“处于左上角”条件 while(1) { read(ts_fd, &ts_event, sizeof(ts_event)); //3.分析读取的设备信息 (type + code + value) if (ts_event.type == EV_ABS) //说明是触摸屏 { if (ts_event.code == ABS_X) //说明是X轴 { cnt++; x = ts_event.value * 800 / 1024; } if (ts_event.code == ABS_Y) //说明是Y轴 { cnt++; y = ts_event.value * 480 / 600; } } //读取完整的坐标进行判断 if(cnt >= 2) { //计数器清零 cnt = 0; #ifdef DEBUG //调试代码用 printf("x = %d y = %d\n",x,y); #endif //上锁 pthread_mutex_lock(&fastmutex); //条件判断 if(x >= 0 && x = 0 && y |