首页 > 编程语言 >系统编程POSIX信号量题

系统编程POSIX信号量题

时间:2024-05-31 21:11:15浏览次数:16  
标签:int 编程 ts 信号量 互斥 线程 POSIX include event

系统编程

POSIX信号量

题目

设计一个程序,主线程需要创建2个子线程之后主线程终止,此时进程中有2个子线程A和B,此时进程中有一个临界资源flag,子线程A获取触摸屏坐标并判断坐标值是否在LCD屏的左上角,如果坐标范围满足左上角,则利用条件量和互斥锁来唤醒子线程B,子线程B的任务是判断flag 是否大于0,如果子线程B的条件满足,则让子线程B在终端输出一个字符串即可。要求进程中使用条件量和互斥锁实现线程的同步以及临界资源的互斥访问。

代码

/***********************************************************************************
*
*	file name:	pthread_cond.c
*	author	 :  [email protected] 
*	date	 :  2024/05/31
*	function :  该案例是在进程中使用条件量和互斥锁实现线程的同步以及临界资源的互斥访问
* 	note	 :  
*               由于使用了线程函数接口,所以编译时需要加上-pthread
*   version  :
*
*	CopyRight (c)  2023-2024   [email protected]   All Right Reseverd 
*
* **********************************************************************************/
/************************************头文件*****************************************/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <linux/input.h>
#include <pthread.h>
#include <unistd.h>
/***********************************************************************************/
/************************************全局变量***************************************/
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int lcd_fd;     //lcd屏文件
int ts_fd;      //触摸屏文件
int *lcd_mp;    //指向LCD屏映射空间地址的指针变量
// 临界资源flag,应该使用volatile修饰,防止编译器优化
volatile int x,y;
volatile int flag = 0;
/**********************************************************************************/
/***********************************************************************************
*
*	name	 :	thread_A_func
*	function :  线程A的任务函数,获取触摸屏坐标并判断坐标值是否在LCD屏的左上角,
*               如果坐标范围满足左上角,则利用条件量和互斥锁来唤醒子线程B
*	param :  
*				none
*				
*	retval	 :  none
*	author	 :  [email protected] 
*	date	 :  2024/05/31
* 	note	 :  由于线程B处于挂起状态,所以需要在线程A中设定条件唤醒线程B进,防止
*               死锁情况出现
*   version  :
* 	
* *********************************************************************************/
void *thread_A_func(void *arg)
{
    //2.读取输入设备的信息
	struct input_event ts_event;

    int cnt = 0;
	
	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;
                printf("x = %d, y = %d\n",x,y);

                // 用互斥锁上锁
                pthread_mutex_lock(&mutex);

                //判断坐标值是否在LCD屏左上角
                if (x >= 0 && x <= 200 && y >= 0 && y <= 200)
                {
                    flag = 1;
                    //用条件来唤醒子线程B
                    pthread_cond_signal(&cond);
                }

                // 用互斥锁解锁
                pthread_mutex_unlock(&mutex);
			}
		}  
	}
}
/***********************************************************************************
*
*	name	 :	thread_B_func
*	function :  线程B的任务函数,判断fag 是否大于 0,如果子线程B的条件满足,
*               则让子线程B在终端输出字符串
*	param :  
*				none
*				
*	retval	 :  none
*	author	 :  [email protected] 
*	date	 :  2024/05/31
* 	note	 :  由于经过线程A的信号通知,flag 变为1,所以线程B的条件满足,执行线程B的
*               任务函数后,需对flag的值进行修改,防止死锁情况出现
*   version  :
* 	
* *********************************************************************************/
void *thread_B_func(void *arg)
{
    while (1)
    {
        // 用互斥锁上锁
        pthread_mutex_lock(&mutex);

        // 判断flag是否大于0
        if (flag <= 0)
        {
            pthread_cond_wait(&cond, &mutex);
        }
        printf("The coordinates are in the upper left corner\n");
        flag = 0;

        // 用互斥锁解锁
        pthread_mutex_unlock(&mutex);
    }
    
}

int main()
{

    //打开LCD屏
	lcd_fd = open("/dev/fb0",O_RDWR);

    //打开触摸屏   
	ts_fd = open("/dev/input/event0",O_RDWR);

	//2.对LCD进行内存映射  mmap
	lcd_mp = (int *)mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcd_fd,0);
    // 初始化读写锁
    // pthread_rwlock_init(&rwlock, NULL);

    // 初始化互斥锁
    pthread_mutex_init(&mutex, NULL);

    // 初始化条件变量
    pthread_cond_init(&cond, NULL);
    
    // 创建子线程B
    pthread_t thread_B;
    pthread_create(&thread_B, NULL, thread_B_func, NULL);

    // 创建子线程C
    pthread_t thread_A;
    pthread_create(&thread_A, NULL, thread_A_func, NULL);

    // 把子线程AB设置为分离态
    pthread_detach(thread_B);
    pthread_detach(thread_A);

    // 主线程终止
    pthread_exit(NULL);

    return 0;
}

结果

image

标签:int,编程,ts,信号量,互斥,线程,POSIX,include,event
From: https://www.cnblogs.com/cwp-home/p/18225283

相关文章

  • 同步互斥——进程篇(一)信号量
    信号量(Semaphores)信号量是一种用于进程间或线程间同步的机制。它可以限制多个进程或线程对共享资源的并发访问,确保资源被安全使用。信号量的核心思想是通过计数来控制访问,计数值表示当前可以访问资源的可用数量。计数器:信号量的核心是一个整数计数器。当计数器大于0时,表......
  • 系统编程练习题----利用条件量和互斥锁,实现两个线程之间的同步与互斥
    目录题目解析代码结果展示题目解析​ 该题主要依靠条件量和互斥锁来实现线程之间的同步与互斥,分析主线程、线程A和线程B的任务如下:主线程:打开LCD屏和触摸屏的硬件文件,并分别存储两个文件的文件描述符,方便后面进行条件判断。开启线程A和线程B。定义并初始化条件量和互斥......
  • 系统编程
    系统编程目录系统编程1.管道通信1.1匿名管道(pipe)1.2命名管道(fifo)2.消息队列3.共享内存4.信号量1.管道通信1.1匿名管道(pipe)//创建子线程pid_tfork(void);/****************************************返回值 成功(父进程)>0/(子进程)0 失败 -1(父进程,不创建子......
  • 系统编程——信号通信
    信号通信信号(英文翻译为signal)是Unix系统、类Unix系统(比如Linux系统)以及其他POSIX兼容的操作系统中用于实现进程间通信的一种方式。信号是一种异步通信机制。信号的发生1.按键触发按键触发指的是用户按下某个快捷键,然后由内核发送指定的信号给进程,比如用户准备在Linux系统的......
  • Java的JDBC编程
     博主主页: 码农派大星.  数据结构专栏:Java数据结构 数据库专栏:MySQL数据库关注博主带你了解更多数据结构知识1.Java的数据库编程:JDBC数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提供了Java的驱动包mysql-connector-java,需......
  • 《Java练习题》Java编程题合集(全)
    《Java练习题》Java编程题合集(全) 前言:不仅仅要实现,更要提升性能,精益求精,用尽量少的时间复杂度和空间复杂度解决问题。初学者:《Java练习题》习题集一  https://www.cnblogs.com/jssj/p/11147566.html《Java练习题》习题集二  https://www.cnblogs.com/jssj/p/1122235......
  • 什么是机器人离线编程? 衡祖仿真
    一、什么是机器人离线编程?机器人离线编程是自动化生产的重要一环。离线编程指,在建立了机器人的三维模拟场景后,经由软件仿真计算,生成控制机器人运动轨迹,进而生成机器人的控制指令。工程师可以由此来控制物理环境中的机器人。与普通机器人示教编程不同,在离线编程过程中,机器人等生......
  • 【React】react函数式编程常用hooks讲解
    ReactHooks是React16.8版本引入的一项重要特性,它极大地简化和优化了函数组件的开发过程。React中常用的Hooks,包括useState、useEffect、useContext、useReducer、useCallback、useMemo、useRef、useLayoutEffect等。这些Hooks涵盖了状态管理、副作用处理、性能......
  • 网络编程
    网络编程--客户端和服务器端客户端和服务器端实现连接和通信服务器端:通过sock套接字进行连接通信#include<WinSock2.h>#include<Windows.h>#include<iostream>#include<WS2tcpip.h>#pragmacomment(lib,"ws2_32.lib")intmain(){ //初始化网络环境 WSADATAdate{0......
  • 【JavaScript脚本宇宙】编程新视野:JavaScript中的六大重要实用库
    增强你的代码:深入浅出JavaScript实用工具库前言在动态且多变的编程世界中,实用程序库已经成为开发者们提升效率、优化代码的得力助手。本文将深入探讨六个广受欢迎的JavaScript实用程序库,它们各自具有独特的功能和应用场景,无论你是初学者还是资深开发者,或许都能在其中找到......