首页 > 系统相关 >进程控制(互斥锁)

进程控制(互斥锁)

时间:2024-05-31 20:44:09浏览次数:22  
标签:控制 int 互斥 cond pthread 进程 哦哦哦 include 唤醒

进程控制(互斥锁)

目录

头文件

/********************************************************************
 *
 *	name	 :
 *	function :主线程需要创建2个子线程之后主线程终止,此时进程中有2个子线程A和 B,此时进程中有一个临界资源 fag,
 子线程A获取触摸屏坐标并判断坐标值是否在LCD屏的左上角,如果坐标范围满足左上角,则利用条件量和互斥锁来唤醒子线程B,
 子线程B的任务是判断fag 是否大于 0,如果子线程B的条件满足,则让子线程B在终端输出一个字符串即可。
 要求进程中使用条件量和互斥锁实现线程的同步以及临界资源的互斥访问
 *	argument :
 *				@n  :需要计算的值n
 *
 *	retval	 :
 *	author	 :  [email protected]
 *	date	 :  2024年5月31日
 * 	note	 :
 *      变量
 *     pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
 *      初始化
       int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);
        启动唤醒
       int pthread_cond_signal(pthread_cond_t *cond);
        唤醒所有
       int pthread_cond_broadcast(pthread_cond_t *cond);
        等待
       int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
        等待一段时间
       int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);
        销毁
       int pthread_cond_destroy(pthread_cond_t *cond);

         int sem_init(sem_t *sem, int pshared, unsigned int value);
         sem_t *sem_open(const char *name, int oflag,
                       mode_t mode, unsigned int value);
 * *****************************************************************/
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdio.h>
#include <fcntl.h>    /* For O_* constants */
#include <sys/stat.h> /* For mode constants */
#include <semaphore.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
#include <signal.h>
#include <string.h>
#include <sys/ipc.h>
#include <linux/input.h>
#include <sys/mman.h>     

全局变量

volatile int fag = 0, cnt, x, y, a;             // 临界资源 fag,cnt,x,y
int *lcd_mp;                                    // lcd映射
int lcd_fd, ts_fd;                              // lcd和触摸屏
struct input_event ts_event;                    // 触摸信息存放
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; // 条件量
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
sem_t *sem;
char buf[10] = {1};

2

/********************************************************************
 *
 *	name	 :funcA
 *	function :获取触摸屏坐标并判断坐标值是否在LCD屏的左上角,如果坐标范围满足左上角,则利用条件量和互斥锁来唤醒子线程B
 *	argument :
 *				@n  :需要计算的值n
 *
 *	retval	 :pthread_cond_broadcast  pthread_cond_destroy
                pthread_cond_init       pthread_cond_signal
                 pthread_cond_timedwait  pthread_cond_wait
 *	author	 :  [email protected]
 *	date	 :  2024年5月31日
 * 	note	 :
 *
 * *****************************************************************/

void *
funcA(void *arc)
{
    pthread_mutex_lock(&mut);
    for (;;)
    { //  read函数默认会阻塞的,也就是没有读取数据,则卡这句话
        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 && x > 0 && x < 100 && y > 0 && y < 100)
            {
                fag = 3;
            }
            printf("唤醒\n");
            // 唤醒B
            pthread_cond_signal(&cond);
            // 还锁
            pthread_mutex_unlock(&mut);
        }
    }
}

3

/********************************************************************
 *
 *	name	 :funcB
 *	function :
 *	argument :判断fag 是否大于 0,如果子线程B的条件满足,则让子线程B在终端输出一个字符串
 *				@n  :需要计算的值n
 *
 *	retval	 :
 *	author	 :  [email protected]
 *	date	 :  2024年5月31日
 * 	note	 :
 *
 * *****************************************************************/
void *funcB(void *arc)
{
    for (;;)
    {
        pthread_mutex_lock(&mut);
        if (fag == 3)
        {
            pthread_cond_wait(&cond, &mut);
            printf("哦哦哦哦哦哦哦哦哦\n");
            fag = 0;
        }
        // sleep(3);
        pthread_mutex_unlock(&mut);
    }
}

4

int main(int argc,
         char const *argv[])
{
    buf[0] = 'a';
    // 1.打开LCD   open
    lcd_fd = open("/dev/fb0", O_RDWR);

    // 2.对LCD进行内存映射  mmap
    lcd_mp = (int *)mmap(NULL,
                         800 * 480 * 4,
                         PROT_READ | PROT_WRITE, MAP_SHARED,
                         lcd_fd, 0);

    ts_fd = open("/dev/input/event0", O_RDWR);

    // 创建两个线程
    pthread_t Afunc;
    pthread_t Bfunc;
    pthread_create(&Afunc, NULL, funcA, NULL);
    pthread_create(&Bfunc, NULL, funcB, NULL);

    // 初始化
    pthread_cond_init(&cond, NULL);

    // 结束主进程
    pthread_exit(NULL);
    return 0;
}

验证

点击后
[root@GEC6818 /ljw]#./a
唤醒
唤醒
哦哦哦哦哦哦哦哦哦
唤醒
唤醒
哦哦哦哦哦哦哦哦哦
唤醒
唤醒
哦哦哦哦哦哦哦哦哦
唤醒
唤醒
唤醒
唤醒
唤醒

标签:控制,int,互斥,cond,pthread,进程,哦哦哦,include,唤醒
From: https://www.cnblogs.com/ljw-boke/p/18225257

相关文章

  • 通过互斥锁+条件量的方式实现同步与互斥
    #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......
  • 前端学习-Dart官方文档学习-005-控制流
    官方文档链接Loops循环forloopswhileanddowhileloopsbreakandcontinueBranching,likeifandswitchExceptions,liketry,catch,andthrowfor、for-in、forEachvarcallbacks=[];for(vari=0;i<2;i++){callbacks.add(()=>print(i));}//Th......
  • 第一个用户进程 --- 根文件系统 sbin/init 进程 及其配置文件 /etc/inittab
    sbin/init是根文件系统提供的用户进程,它是第一个被执行的用户进程。执行过程会读取配置文件/etc/inittab,运行inittab文件中的各个子进程。 inittab配置文件格式Formatforeachentry:<id>:<runlevels>:<action>:<process>id:  表示这个子进程要使用的控制台,如果省略,......
  • linux核心基础-进程与资源管理
    1、linux资源管理器linux中对需要运维去管理、去查看的资源信息,如下内存资源、使用率free命令磁盘资源、使用率dfCPU资源、使用率tophtopglances进程资源、使用率pspstreepidof网络资源、使用率Iftop所有资源的整体查看命令topglanceshtop2、进程2.1区分进......
  • linux的孤儿进程
    在Linux系统中,孤儿进程是指其父进程已经终止或被杀死,而该进程本身还在运行的进程。当父进程正常退出或异常终止时,它的所有子进程都将变为孤儿进程。这些孤儿进程不再有任何父进程来监控和管理它们的状态。然而,Linux系统并不会让这些孤儿进程成为真正的“孤儿”。相反,系统会......
  • cadical基本数据结构分析3——运行状态控制
    在一对文件(options.hpp和options.cpp)运行控制参数统一初始化并设置动态增长规律; 1#ifndef_options_hpp_INCLUDED2#define_options_hpp_INCLUDED34/*------------------------------------------------------------------------*/56//Inorder......
  • PMSM永磁同步电机滑膜控制SVPWM矢量控制(Simulink仿真实现)
      ......
  • Xilinx FPGA NVMe A4S Host Controller, 高性能NVMe A4S主机控制器IP
    NVMeA4SHostControllerIP1     介绍NVMeA4SHostControllerIP可以连接高速存储PCIeSSD,无需CPU和外部存储器,自动加速处理所有的NVMe协议命令,具备独立的数据写入AXI4-Stream/FIFO接口和数据读取AXI4-Stream/FIFO接口,适合于高性能、顺序访问的应用,比如视频记录、信号......
  • 互斥锁练习题
    练习:设计一个程序,程序中有3个线程,主线程A创建一个文本,每隔5s获取一次系统时间并写入到该文本中,另外两个线程B和C分别从文本中读取当前的时间和日期,子线程B输出系统时间"hh:mm:ss",子线程c输出系统日期"2024年05月31日”,要求使用读写锁实现互斥。提示:主线程A获取写操作的锁,另外......
  • C++ IO流:控制台输入输出
    C++输入输出头文件#include<iostream>,常用于控制台打印/OJ数据读取分别对应:控制台IO流/文件流/字符串流,本文主要介绍控制台输出输出流cin>>空格分隔cout<<控制台输出已知待读取元素的数量:cin>>n未知待读取元素的数量:while(cin>>val)另外,可以整行读取数据,然......