首页 > 系统相关 >在进程中使用条件量和互斥锁实现线程的同步以及临界资源的互斥访问

在进程中使用条件量和互斥锁实现线程的同步以及临界资源的互斥访问

时间:2024-06-01 10:34:44浏览次数:13  
标签:int ts 互斥 临界 线程 pthread include event

img

/*******************************************************************
*	author	 :  北极甜虾呦
*	date	 :  2024/06/01
*	function :  进程中使用条件量和互斥锁实现线程的同步以及临界资源的互斥访问
* 	note	 :  None
*	CopyRight (c)  2023-2024   [email protected]   All Right Reseverd 
*
* *****************************************************************/
#include <pthread.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>  //触摸屏必须包含该头文件

int x,y;
int ts_fd;
//临界资源,应该使用volatile进行修饰,防止编译器对该变量进行优化
volatile int flag = 0; 

//初始化互斥量和条件量
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;


int ts_x, ts_y;

//声明触摸函数
void ts_getval(int ts_fd,int *ts_x,int *ts_y);

//子线程A
void *task_A(void *arg)
{

    while(1)
    {   
        //获取触摸的函数
        ts_getval(ts_fd,&ts_x,&ts_y);
        //上锁
        pthread_mutex_lock(&mut);
        //判断触摸的位置
        if(x>0 && x<100 && y>0 && y<100)
        {
            flag = 1;//设置临界资源的值
        }
       
        //唤醒子进程B
        pthread_cond_broadcast(&cond);

        x = 0;
        y = 0;

        //解锁
        pthread_mutex_unlock(&mut);

    }
}

//子线程B
void *task_B(void *arg)
{

    while(1)
    {
       //上锁
        pthread_mutex_lock(&mut);

        //如果满足此条件则子线程B挂起(睡眠),此时会自动解锁,不会往下执行
        while(flag == 0){
                pthread_cond_wait(&cond, &mut);
        }

        //满足此条件则打印字符串
        if (flag > 0) {
            
            printf("I am thread_B,str = [%s]\n","hello world");
            flag = 0;//复位flag的值
        }
        //解锁
        pthread_mutex_unlock(&mut);

    }
}


int main()
{


  //1.打开触摸屏   
	ts_fd = open("/dev/input/event0",O_RDWR);
	if (-1 == ts_fd)
	{
		fprintf(stderr, "open ts error,errno:%d,%s\n",errno,strerror(errno));
		return -1;
	}
    //1.创建子线程A
    pthread_t thread_A;
    pthread_create(&thread_A,NULL,task_A,NULL);

    //2、创建子线程B
    pthread_t thread_B;
    pthread_create(&thread_B,NULL,task_B,NULL);

    //3、终止主线程
    pthread_exit(NULL);
  
    while(1);
    return 0;
}



void ts_getval(int ts_fd,int *ts_x,int *ts_y)
{

	int cnt = 0;
    //1.读取输入设备的信息
    struct input_event ts_event;
    
    //2.循环获取坐标,当获取到完整坐标(x,y)则终止循环
    while(1)
    {
		//read函数默认会阻塞的,也就是没有读取数据,则卡这句话 
		read(ts_fd,&ts_event,sizeof(ts_event));

		//3.分析读取的设备信息 (type + code + value)
		if (ts_event.type == EV_ABS && ts_event.code ==  ABS_X) //说明是触摸屏X轴
		{	
		  	cnt++;
		  	*ts_x = ts_event.value * 800 / 1024;
		}
		if (ts_event.type == EV_ABS && ts_event.code ==  ABS_Y) //说明是触摸屏Y轴
		{		
		  	cnt++;
		  	*ts_y = ts_event.value * 480 / 600;
		}	
		
		//如果获取完整坐标,则输出获取的坐标用于项目测试	
		if(cnt >= 2)
		{
            x = *ts_x;
            y = *ts_y;
			printf("x = %d\t",x); //输出X轴坐标
			printf("y = %d\n",y); //输出Y轴坐标
			break;
		}		
    }
}

标签:int,ts,互斥,临界,线程,pthread,include,event
From: https://www.cnblogs.com/lwj294/p/18225620

相关文章

  • 5种方法,教你判断线程池是否全部完成
    5种方法,教你判断线程池是否全部完成前言isTerminated方式getCompletedTaskCountCountDownLatch计数器CountDownLatch概述维护一个公共计数Future判断任务执行状态前言最近写代码的时候用到了CountDownLatch计数器,然后顺便想了想判断线程池全部结束有多少种方......
  • 熟悉条件量和互斥量的结合使用
    /***************************************************filename:1.c*author:[email protected]*date:2024/05/31*brief:作业:设计一个程序,主线程需要创建2个子线程之后主线程终止,*此时进程中有2个子线程A和B,此时进程中有一个临......
  • 同步互斥——进程篇(一)信号量
    信号量(Semaphores)信号量是一种用于进程间或线程间同步的机制。它可以限制多个进程或线程对共享资源的并发访问,确保资源被安全使用。信号量的核心思想是通过计数来控制访问,计数值表示当前可以访问资源的可用数量。计数器:信号量的核心是一个整数计数器。当计数器大于0时,表......
  • 系统编程练习题----利用条件量和互斥锁,实现两个线程之间的同步与互斥
    目录题目解析代码结果展示题目解析​ 该题主要依靠条件量和互斥锁来实现线程之间的同步与互斥,分析主线程、线程A和线程B的任务如下:主线程:打开LCD屏和触摸屏的硬件文件,并分别存储两个文件的文件描述符,方便后面进行条件判断。开启线程A和线程B。定义并初始化条件量和互斥......
  • 使用条件量和互斥锁实现线程的同步以及临界资源的互斥访问
    /********************************************************************** name :* function:主线程需要创建2个子线程之后主线程终止,此时进程中有2个子线程A和B,此时进程中有一个临界资源fag,子线程A获取触摸屏坐标并判断坐标值是否在LCD屏的左上角,如果坐标范围满足......
  • 进程控制(互斥锁)
    进程控制(互斥锁)目录进程控制(互斥锁)头文件全局变量234验证头文件/********************************************************************** name :* function:主线程需要创建2个子线程之后主线程终止,此时进程中有2个子线程A和B,此时进程中有一个临界资源fag,子线程......
  • 【自定义线程池】超详细!一文轻松理解JDK线程池 - java
    【自定义线程池】超详细!一文轻松理解JDK线程池-java通过手敲一遍自定义线程池代码,轻松理解jdk中线程池的原理,可以放心告诉面试官研究过jdk线程池源码!本文参考b站黑马程序员满一航老师的JUC课程p200-208https://www.bilibili.com/video/BV16J411h7Rd?p=207&vd_sour......
  • 通过互斥锁+条件量的方式实现同步与互斥
    #include<stdio.h>#include<stdlib.h>#include<pthread.h>#include<semaphore.h>#include<unistd.h>#include<string.h>#include<fcntl.h>//forO_CREATandO_EXCL#include<sys/ipc.h>#include<sys/s......
  • 滴滴面试:谈谈你对Netty线程模型的理解?
    Netty线程模型是指Netty框架为了提供高性能、高并发的网络通信,而设计的管理和利用线程的策略和机制。Netty线程模型被称为Reactor(响应式)模型/模式,它是基于NIO多路复用模型的一种升级,它的核心思想是将IO事件和业务处理进行分离,使用一个或多个线程来执行任务的一种机制。......
  • 互斥锁练习题
    练习:设计一个程序,程序中有3个线程,主线程A创建一个文本,每隔5s获取一次系统时间并写入到该文本中,另外两个线程B和C分别从文本中读取当前的时间和日期,子线程B输出系统时间"hh:mm:ss",子线程c输出系统日期"2024年05月31日”,要求使用读写锁实现互斥。提示:主线程A获取写操作的锁,另外......