精华内容
下载资源
问答
  • 临界区特点: 属于公共资源或者共享数据。 同一时间只能被一个线程占用 如果该临界区资源被占用,其他想使用临界区资源的线程只能等待。 在并行(多核)程序中,临界区资源是保护的对象。 思考: 1 临界区...

    临界区特点:

    • 属于公共资源或者共享数据。
    • 同一时间只能被一个线程占用
    • 如果该临界区资源被占用,其他想使用临界区资源的线程只能等待。
    • 在并行(多核)程序中,临界区资源是保护的对象。

    思考:
    1 临界区是否是通过给它加锁来实现线程独占资源的?
    1.1 并行程序中保护临界区资源实现机制?
    2 cpu是一种资源,临界区也是一种资源(都是站在线程的角度来说的),如果cpu可以通过多核解决性能问题,那临界区是否可以通过什么方案来解决性能瓶颈?
    3:临界区是线程执行中某个节点必要资源,还是可选条件?

    因为目前为小白,如果有朋友能回答我的问题,那万分感谢,如果没回应,那我后期会回头来解答这个问题。

    展开全文
  • 什么是临界区

    千次阅读 2017-07-17 11:34:54
    临界区[1] 的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个线程访问的特性。当有线程进入临界区段时,其他线程或是进程必须等待(例如:bounded waiting ...
    临界区[1]  
    指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个
    线程
    访问的特性。当有线程进入临界区段时,其他线程或是
    进程
    必须等待(例如:bounded waiting 等待法),有一些同步的机制必须在临界区段的进入点与离开点实现,以确保这些共用资源是被互斥获得使用,例如:
    semaphore
    。只能被单一线程访问的设备,例如:
    打印机
    
    [1]
     
    展开全文
  • 多线程之临界区

    千次阅读 2018-01-24 12:45:17
    *一般情况下需要创建多个线程来提高程序的执行效率,但是多个线程同时运行的时候可能调用线程函数,在多个线程同时对一个内存...临界区对象是定义在数据段中的一个CRITICAL_SECTION结构,Windows内部使用这个结构记录

    *一般情况下需要创建多个线程来提高程序的执行效率,但是多个线程同时运行的时候可能调用线程函数,在多个线程同时对一个内存地址进行写入操作,由于CPU时间调度的问题,写入的数据会被多次覆盖,所以要使线程同步。

    就是说,当有一个线程对文件进行操作时,其它线程只能等待。可以通过临界区对象实现线程同步。临界区对象是定义在数据段中的一个CRITICAL_SECTION结构,Windows内部使用这个结构记录一些信息,确保同一时间只有一个线程访问改数据段中的数据。

    使用临界区的步骤如下:

    (1)初始化一个CRITICAL_SECTION结构;在使用临界区对象之前,需要定义全局CRITICAL_SECTION变量,在调用CreateThread函数前调用InitializeCriticalSection函数初始化临界区对象;

    (2)申请进入一个临界区;在线程函数中要对保护的数据进行操作前,可以通过调用EnterCriticalSection函数申请进入临界区。由于同一时间内只能有一个线程进入临界区,所以在申请的时候如果有一个线程已经进入临界区,则该函数就会一直等到那个线程执行完临界区代码;

    (3)离开临界区;当执行完临界区代码后,需要调用LeaveCriticalSection函数离开临界区;

    (4)删除临界区;当不需要临界区时调用DeleteCriticalSection函数将临界区对象删除;

    下面的代码创建了5个线程,每个线程在文件中写入1个“hello”:

    #include<stdio.h>
    #include<windows.h>
    HANDLE hFile;
    CRITICAL_SECTION cs;//定义临界区全局变量
    //线程函数:在文件中写入10000个hello
    DWORD WINAPI Thread(LPVOID lpParam)
    {
        int n = (int)lpParam;
        DWORD dwWrite;
        for (int i = 0; i < 1; ++i)
        {
            EnterCriticalSection(&cs);//进入临界区
            char data[512] = "hello\r\n";
            //写文件
            WriteFile(hFile, data, strlen(data), &dwWrite, NULL);
            //离开临界区
            LeaveCriticalSection(&cs);
        }
        printf("Thread #%d returned successfully\n ", n);
        return 0;
    }
    int main()
    {
        char *filename = "hack.txt";
        WCHAR name[20] = { 0 };
        MultiByteToWideChar(CP_ACP, 0, filename, strlen(filename) + 1, name, sizeof(name) / sizeof(name[0]));//字符转化
        //创建文件
        hFile = CreateFile(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
        if (hFile == INVALID_HANDLE_VALUE)
        {
            printf("CreateFile error.\n");
            return 0;
        }
        DWORD ThreadID;
        HANDLE hThread[5];
        //初始化临界区
        InitializeCriticalSection(&cs);
        for (int i = 0; i < 5; ++i)
        {
            //创建线程,并调用Thread写文件
            hThread[i] = CreateThread(NULL, 0, Thread, (LPVOID)(i + 1), 0, &ThreadID);
            printf("Thread #%d has been created successfully.\n", i + 1);
        }
        //等待所有进程结束
        WaitForMultipleObjects(5, hThread, TRUE, INFINITE);
        //删除临界区
        DeleteCriticalSection(&cs);
        //关闭文件句柄
        CloseHandle(hFile);
        return 0;
    }

    线程是进程中的一个实体,是被系统独立调度和分派的基本单位。一个进程可以拥有多个线程,但是一个线程必须有一个进程。线程自己不拥有系统资源,只有运行所必须的一些数据结构,但它可以与同属于一个进程的其它线程共享进程所拥有的全部资源,同一个进程中的多个线程可以并发执行。

    在C/C++中可以通过CreateThread函数在进程中创建线程,函数的具体格式如下:

    [cpp] view plain copy

    HANDLE CreateThread(  
                        LPSECURITY_ATTRIBUTES lpThreadAttributes,  
                        DWORD dwStackSize,  
                        LPTHREAD_START_ROUTINE lpStartAddress,  
                        LPVOID lpParameter,  
                        DWORD dwCreationFlags,  
                        LPDWORD lpThreadID  
                       );  
    

    参数的含义如下:

    lpThreadAttrivutes:指向SECURITY_ATTRIBUTES的指针,用于定义新线程的安全属性,一般设置成NULL;

    dwStackSize:分配以字节数表示的线程堆栈的大小,默认值是0;

    lpStartAddress:指向一个线程函数地址。每个线程都有自己的线程函数,线程函数是线程具体的执行代码;

    lpParameter:传递给线程函数的参数;

    dwCreationFlags:表示创建线程的运行状态,其中CREATE_SUSPEND表示挂起当前创建的线程,而0表示立即执行当前创建的进程;

    lpThreadID:返回新创建的线程的ID编号;

    如果函数调用成功,则返回新线程的句柄,调用WaitForSingleObject函数等待所创建线程的运行结束。函数的格式如下:

    [cpp] view plain copy

    DWORD WaitForSingleObject(  
                              HANDLE hHandle,  
                              DWORD dwMilliseconds  
                             );  
    

    参数的含义如下:

    hHandle:指定对象或时间的句柄;

    dwMilliseconds:等待时间,以毫秒为单位,当超过等待时间时,此函数返回。如果参数设置为0,则该函数立即返回;如果设置成INFINITE,则该函数直到有信号才返回。

    展开全文
  • 【STM32】FreeRTOS临界区

    千次阅读 2020-11-08 17:22:01
    临界段代码也叫做临界区,是那些必须完整运行,不能被打断的代码段,比如有的外设的初始化需要严格的时序,初始化过程中不能被打断。FreeRTOS在进入临界端代码的时候需要关闭中断,当处理完临界段代码以后再打开...

    00. 目录

    01. 概述

    临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段,比如有的外设的初始化需要严格的时序,初始化过程中不能被打断。FreeRTOS在进入临界端代码的时候需要关闭中断,当处理完临界段代码以后再打开中断。FreeRTOS系统本身就有很多的临界段代码。这些代码都加了临界段代码保护,我们在写自己的用户程序的时候有些地方也需要添加临界段代码保护。

    FreeRTOS与临界段代码保护有关的函数有4个:

    /**
     * task. h
     *
     * Macro to mark the start of a critical code region.  Preemptive context
     * switches cannot occur when in a critical region.
     *
     * NOTE: This may alter the stack (depending on the portable implementation)
     * so must be used with care!
     *
     * \defgroup taskENTER_CRITICAL taskENTER_CRITICAL
     * \ingroup SchedulerControl
     */
    #define taskENTER_CRITICAL()               portENTER_CRITICAL() //任务级
    #define taskENTER_CRITICAL_FROM_ISR()      portSET_INTERRUPT_MASK_FROM_ISR() //中断级
    
    /**
     * task. h
     *
     * Macro to mark the end of a critical code region.  Preemptive context
     * switches cannot occur when in a critical region.
     *
     * NOTE: This may alter the stack (depending on the portable implementation)
     * so must be used with care!
     *
     * \defgroup taskEXIT_CRITICAL taskEXIT_CRITICAL
     * \ingroup SchedulerControl
     */
    #define taskEXIT_CRITICAL()                portEXIT_CRITICAL() //任务级
    #define taskEXIT_CRITICAL_FROM_ISR( x )    portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) //中断级
    

    02. 任务级临界区代码保护

    taskENTER_CRITICAL()和taskEXIT_CRITICAL()是任务级的临界区代码保护,一个是进入临界区,一个是退出临界区,这两个函数一定要成对的使用。

    /**
     * task. h
     *
     * Macro to mark the start of a critical code region.  Preemptive context
     * switches cannot occur when in a critical region.
     *
     * NOTE: This may alter the stack (depending on the portable implementation)
     * so must be used with care!
     *
     * \defgroup taskENTER_CRITICAL taskENTER_CRITICAL
     * \ingroup SchedulerControl
     */
    #define taskENTER_CRITICAL()               portENTER_CRITICAL() //任务级
    
    
    /**
     * task. h
     *
     * Macro to mark the end of a critical code region.  Preemptive context
     * switches cannot occur when in a critical region.
     *
     * NOTE: This may alter the stack (depending on the portable implementation)
     * so must be used with care!
     *
     * \defgroup taskEXIT_CRITICAL taskEXIT_CRITICAL
     * \ingroup SchedulerControl
     */
    #define taskEXIT_CRITICAL()                portEXIT_CRITICAL() //任务级
    

    portENTER_CRITICAL()和portEXIT_CRITICAL()也是宏定义,在portmacro.h中有定义。

        #define portENTER_CRITICAL()                      vPortEnterCritical()
        #define portEXIT_CRITICAL()                       vPortExitCritical()
    

    vPortEnterCritical()和vPortExitCritical()函数实现如下:

    void vPortEnterCritical( void )
    {
        portDISABLE_INTERRUPTS();
        uxCriticalNesting++;
    
        /* This is not the interrupt safe version of the enter critical function so
         * assert() if it is being called from an interrupt context.  Only API
         * functions that end in "FromISR" can be used in an interrupt.  Only assert if
         * the critical nesting count is 1 to protect against recursive calls if the
         * assert function also uses a critical section. */
        if( uxCriticalNesting == 1 )
        {
            configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 );
        }
    }
    
    void vPortExitCritical( void )
    {
        configASSERT( uxCriticalNesting );
        uxCriticalNesting--;
    
        if( uxCriticalNesting == 0 )
        {
            portENABLE_INTERRUPTS();
        }
    }
    

    03.中断级临界区代码保护

    taskENTER_CRITICAL_FROM_ISR()和taskEXIT_CRITICAL_FROM_ISR()是中断级别临界区代码保护,是用在中断服务程序中的,而且这个中断的优先级一定要低于预先设置的值。

    /**
     * task. h
     *
     * Macro to mark the start of a critical code region.  Preemptive context
     * switches cannot occur when in a critical region.
     *
     * NOTE: This may alter the stack (depending on the portable implementation)
     * so must be used with care!
     *
     * \defgroup taskENTER_CRITICAL taskENTER_CRITICAL
     * \ingroup SchedulerControl
     */
    #define taskENTER_CRITICAL_FROM_ISR()      portSET_INTERRUPT_MASK_FROM_ISR() //中断级
    
    /**
     * task. h
     *
     * Macro to mark the end of a critical code region.  Preemptive context
     * switches cannot occur when in a critical region.
     *
     * NOTE: This may alter the stack (depending on the portable implementation)
     * so must be used with care!
     *
     * \defgroup taskEXIT_CRITICAL taskEXIT_CRITICAL
     * \ingroup SchedulerControl
     */
    #define taskEXIT_CRITICAL_FROM_ISR( x )    portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) //中断级
    

    在portmacro.h文件中有如下定义:

        #define portSET_INTERRUPT_MASK_FROM_ISR()         ulPortRaiseBASEPRI()
        #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x )    vPortSetBASEPRI( x )
    

    ulPortRaiseBASEPRI()和vPortSetBASEPRI()相关实现

        static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI )
        {
            __asm
            {
                /* Barrier instructions are not used as this function is only used to
                 * lower the BASEPRI value. */
    /* *INDENT-OFF* */
            msr basepri, ulBASEPRI
    /* *INDENT-ON* */
            }
        }
    
        static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI( void )
        {
            uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;
    
            __asm
            {
                /* Set BASEPRI to the max syscall priority to effect a critical
                 * section. */
    /* *INDENT-OFF* */
                mrs ulReturn, basepri
                msr basepri, ulNewBASEPRI
                dsb
                isb
    /* *INDENT-ON* */
            }
    
            return ulReturn;
        }
    

    中断级临界区代码应用示例
    在这里插入图片描述

    04. 预留

    05. 预留

    06. 附录

    6.1 【STM32】STM32系列教程汇总

    网址:【STM32】STM32系列教程汇总

    07. 参考

    《FreeRTOS Reference Manual》

    《Using the FreeRTOS Real Time Kernel -A Practical Guide》

    《The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors,3rd Edition》

    展开全文
  • 临界区

    2020-10-19 19:25:52
    临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个线程访问的特性。 当有线程进入临界区段时,其他线程或是进程必须等待(例如:bounded waiting 等待法)...
  • 1.临界资源 临界资源是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式,实现共享的资源称作临界资源。...每个进程中访问临界资源的那段代码称为临界区(criticalsection),每次只允许..
  • 写在前面: 本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知...基本临界区宏 taskENTER_CRITICAL()与 taskEXIT_CRITICAL(...
  • 临界区、相关临界区

    千次阅读 2017-10-09 09:10:27
    1.概念   临界区:每个进程中访问临界资源的那段代码称为临界区(Critical Section) 临界资源:临界资源是一次仅允许...相关临界区:多个进程中涉及到同一个临界资源的临界区称为相关临界区。 百度百科上对临界
  • 什么是临界资源?什么是临界区

    千次阅读 2021-07-06 01:59:40
    导航:网站首页 >...临界区每个进程中访问临界资源的那段程序代码.试题难度:★★☆参考解析: 暂无解析匿名网友:临界区:每个进程中访问临界资源的那段程序叫做临界区。进程对临界区的访问必须互斥,...
  • 操作系统 临界资源 临界区

    千次阅读 2019-06-04 13:53:34
    为了保护共享资源,不让多个进程同时访问这个共享资源,即阻止多个进程同时进入访问这些资源的代码段,这个代码段称为临界区(也称为管程),这种一次只允许一个进程访问的资源称为临界资源. 临界资源是每次仅允许一个...
  • 临界资源和临界区的区别

    千次阅读 2020-07-21 07:57:32
    临界资源和临界区的区别 1.临界资源是一种系统资源,需要不同进程互斥访问,而临界区则是每个进程中访问临界资源的一段代码,是属于对应进程的,临界区前后需要设置进入区和退出区以进行检查和恢复。临界区和临界...
  • 线程同步(windows平台):临界区

    千次阅读 2018-10-23 16:42:20
     临界区指的是一个访问共用资源(例:全局变量)的程序片段,该共用资源无法同时被多个线程访问的特性。有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到...
  • 1.临界区

    2021-05-15 19:40:14
    临界区 的是一个访问共用资源的程序片段,而这些共用资源又无法同时被多个线程访问的特性。 当有线程进入临界区段时,其他线程或是进程必须等待,有一些同步的机制必须在临界区段的进入点与离开点实现, 以确保...
  • FreeRTOS临界区应用与总结

    千次阅读 2019-01-02 15:33:47
     基本临界区宏taskENTER_CRITICAL()和taskEXIT_CRITICAL()之间的代码区间。也被称为Critical Section或者Critical Regions. 使用方法如下: // 为了保证PORTA的访问不被中断,将访问操作放入临界区运行 ...
  • LINUX内核~~~临界区

    2020-11-21 16:50:46
    所谓临界区(也称为临界段)就是访问和操作共享数据的代码段。 多个执行线程并发访问同一个资源是不安全的,为了避免临界区中的并发访问,编程者必须保证这些代码的原子地执行---也就是说,操作想执行结束前不可被...
  • FreeRTOS临界区

    千次阅读 2022-01-05 19:56:56
      FreeRTOS临界区那些必须完整运行,不能被打断的代码段,比如有的外设的初始化需要严格的时序,初始化过程中不能被打断。 FreeRTOS 在进入临界区代码的时候需要关闭中断,当处理完临界区代码以后再打开中断。...
  • 文章目录1 临界区1.1 简介1.2 程序调度法则1.3 线程同步问题2 临界区操作原语2.1 定义全局的锁CRITICAL_SECTION2)InitializeCriticalSection3)EnterCriticalSection和LeaveCriticalSection4) ...
  • 什么是临界资源和临界区

    万次阅读 多人点赞 2016-12-29 16:22:45
    1.临界资源  临界资源是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式,实现共享的资源称作临界... 每个进程中访问临界资源的那段代码称为临界区(criticalsection),每次只允许一个进程进入临界区
  • 每个进程中访问临界资源的那段代码称为临界区(Critical Section) (临界资源是一次仅允许一个进程使用的共享资源)。 每次只准许一个进程进入临界区,进入后不允许其他进程进入。不论是硬件临界资源,还是软件临界...
  • 临界区临界区临界区进程中的一段需要访问共享资源并且另一个进程处于相应代码区域时便不会被执行的代码区域互斥:当一个进程处于临界区并访问共享资源时,没有其他进程会处于临界区并且访问任何相同的共享...
  • 临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个线程访问的特性。 临界区保护方法有四种 (1)第一种方法:直接利用开启或者关闭中断的语句来控制。 比如...
  • 总体呈现:为了保护共享资源,不让多个进程同时访问这个共享资源,即阻止多个进程同时进入访问这些资源的代码段,这个代码段称为临界区(也称为管程),这种一次只允许一个进程访问的资源称为临界资源。 从实际应用的角度...
  • FreeRTOS临界资源保护(临界区保护)

    千次阅读 2019-09-09 22:20:38
    临界区未保护出现的异常   有一种问题相信大家都不愿碰上,就是低概率偶现问题,这类问题的根源,根据作者的经验常见于以下四种情况: - 野指针引用 - 数据越界 - 栈溢出 - 临界资源未保护   今天我们说说...
  • 临界资源和临界区

    2020-03-27 22:03:13
    个人博客:The Blog Of WaiterXiaoYY 欢迎来互相交流学习。...每个进程访问临界资源的那段代码称为临界区。 不论是硬件临界资源还是软件临界资源,多个进程必须互斥地对它进行访问。保证诸进程互斥地进...
  • 临界区的概念

    千次阅读 2019-04-17 07:26:36
    原厂文中有很多临界区这个名词,但是没有详细的介绍。 onstat -u flags= ---PX-- The flag code for position 4: P Primary thread for a session The flag codes for position 5: R Reading X Thread in ...
  • 临界区指会访问临界资源的代码片段。 2.1 API接口 FreeRTOS临界区使用起来比较简单,主要是用来保护临界段的代码运行不被中断。 进出的接口是: taskENTER_CRITICAL() taskEXIT_CRITICAL() 中断函数中的接口 ...
  • 互斥锁、临界区和事件

    千次阅读 2018-11-08 17:00:34
    临界区介绍三.关于条件的使用 一.互斥锁的介绍 互斥锁用于控制多个线程对他们之间共享资源互斥访问的一个信号量。也就是说是为了避免多个线程在某一时刻同时操作一个共享资源。 例如线程池中的有多个空闲线程和一个...
  • 操作系统——临界资源和临界区 1、临界资源 概念:一次仅允许一个进程使用的共享资源。 2、临界区 概念:每个进程中访问临界资源的那段程序称之为临界区临界区不是内核对象,而是系统提供的一种数据结构,程序...
  • 临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个线程访问的特性。当有线程进入临界区段时,其他线程或是进程必须等待,有一些同步的机制必须在临界区段的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,197
精华内容 15,278
关键字:

临界区指