熟悉条件量和互斥量的结合使用
/*************************************************
*
* file name:1.c
* author :momolyl@126.com
* date :2024/05/31
* brief :作业:设计一个程序,主线程需要创建2个子线程之后主线程终止,
* 此时进程中有2个子线程A和 B,此时进程中有一个临界资源 flag,
* 子线程A获取触摸屏坐标并判断坐标值是否在LCD屏的左上角,
* 如果坐标范围满足左上角,则利用条件量和互斥锁来唤醒子线程B,
* 子线程B的任务是判断fag 是否大于 0,如果子线程B的条件满足,
* 则让子线程B在终端输出一个字符串即可。要求进程中使用条件量和
* 互斥锁实现线程的同步以及临界资源的互斥访问
* note :此代码中满足左上角的坐标范围使用输入字符满足'0'-'9'来代替
*
* CopyRight (c) 2024 momolyl@126.com All Right Reseverd
*
**************************************************/
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
int flag = 0; // 标志位变量
pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER; // 初始化互斥锁
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; // 初始化条件量
// 创建子线程A的线程任务
void *threadA_task(void *argc)
{
char inputval;
while (1)
{
// 获取终端输入的值
printf("Please input a char:\n");
scanf(" %c", &inputval);
// 先用互斥锁锁住flag
pthread_mutex_lock(&fastmutex);
// 判断输入的字符是否在字符'0'-'9'之间,满足条件则唤醒B
if (inputval >= '0' && inputval <= '9')
{
// 满足条件则唤醒子线程B
flag = 1;
pthread_cond_signal(&cond);
}
// 解锁flag的互斥锁
pthread_mutex_unlock(&fastmutex);
sleep(2);
}
}
// 创建子线程B的线程任务
void *threadB_task(void *argc)
{
while (1)
{
// 先用互斥锁锁住flag
pthread_mutex_lock(&fastmutex);
// 判断flag是否大于0
if (flag <= 0) // 不满足条件则挂起
{
pthread_cond_wait(&cond, &fastmutex);
}
printf("The value of flag is more than zero!\n");
flag = 0;
// 解锁flag的互斥锁
pthread_mutex_unlock(&fastmutex);
sleep(1);
}
}
int main(int argc, char const *argv[])
{
// 主线程创建2个子线程之后主线程终止
pthread_t thread_A;
pthread_t thread_B;
pthread_create(&thread_A, NULL, threadA_task, NULL);
pthread_create(&thread_B, NULL, threadB_task, NULL);
// 初始化条件量、互斥锁
pthread_cond_init(&cond, NULL);
pthread_mutex_init(&fastmutex, NULL);
pthread_exit(NULL);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】