熟悉条件量和互斥量的结合使用

/*************************************************
 *
 *   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;
}
posted @   铃是铃铛的铃  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示