精华内容
下载资源
问答
  • 临界区是用于保护线程之间调用互斥的机制,主要是为了保护线程内的资源不会被其他线程抢占。 临界资源时临界区内的代码。 2、实现临界资源的几种方式 调度器锁、中断、信号量、互斥量 调度器锁 主要是控制调度器的...

    1、临界区和临界资源概念

    临界区是用于保护线程之间调用互斥的机制,主要是为了保护线程内的资源不会被其他线程抢占。
    临界资源时临界区内的代码。

    2、实现临界资源的几种方式

    调度器锁、中断、信号量、互斥量

    1. 调度器锁
      主要是控制调度器的运行状态,进入临界区后则其他线程不能访问,但是会被中断打断,需要考虑使用后是否会被其他中断所影响。
      void rt_enter_critical(void); /* 进入临界区*/
      void rt_exit_critical(void); /* 退出临界区*/
    2. 中断
      线程主要是基于中断调度,但是可能会影响当前需要中断而运行其他任务。rt-thread的中断API接口由RSP实现,根据平台的不同实现方式也大不相同。为了保证一行代码的互斥运行,最快的速度是中断。可以说中断锁是最强大的和最高效的同步方法。只是使用中断锁最主要的问 题在于,在中断关闭期间系统将不再响应任何中断,也就不能响应外部的事件。所以中断锁 对系统的实时性影响非常巨大。
      rt_base_t rt_hw_interrupt_disable(void);/关闭中断/
      void rt_hw_interrupt_enable(rt_base_t level);/恢复中断/

    下面是我基于HDSCF460MCU移植RT-Thread代码写的使用调度器锁示例程序

    #define  LED0		82
    
    #define THREAD_PRIORITY 25
    #define THREAD_STACK_SIZE 512
    #define THREAD_TIMESLICE 20
    
    
    static rt_thread_t tid1 = RT_NULL;
    static rt_thread_t tid2 = RT_NULL;
    
    static void entry_critical1()
    {
    	int i;
    	while(1)
    	{	
    		rt_enter_critical();
    		for(i = 0;i < 10;i++){	
    			rt_pin_write(LED0,1);
    			rt_kprintf("LED0 HIGH!\r\n");
    			rt_thread_mdelay(100);
    			rt_pin_write(LED0,0);
    			rt_kprintf("LED0 LOW!\r\n");
    			rt_thread_mdelay(100);
    		}
    		rt_exit_critical();
    	}
    }
    static void entry_critical2()
    {
    	int i;
    	while(1)
    	{
    		for(i = 0;i < 10;i++){	
    			
    		rt_pin_write(LED0,1);
    		rt_thread_mdelay(400);
    		rt_pin_write(LED0,0);
    		rt_thread_mdelay(400);
    		}
    	}
    }
    
    int main(void)
    {
    	rt_pin_mode(LED0, PIN_MODE_OUTPUT);
    	dma_check_task_init();
    	user_uart_init(USER_UART_2);
    	user_node_init();
    	tid1 = rt_thread_create("t1",entry_critical1, RT_NULL,THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
    	if (tid1 != RT_NULL)
    		rt_thread_startup(tid1);
    	else
    		return -1;
    	tid2 = rt_thread_create("t2",entry_critical2,RT_NULL,THREAD_STACK_SIZE,THREAD_PRIORITY,THREAD_TIMESLICE-2);
    	if(tid1 != RT_NULL)
    		rt_thread_startup(tid2);
    	else
    		return -1;
    	return 0;
    }
    
    展开全文
  • 临界区

    2017-08-08 15:53:07
    1.临界区只能用于同一进程内的不同线程之间进行通信,不能用于不同进程之间。 2.临界区不属于内核对象,只是用户态进行锁操作,调用时不会进入内核态,因此效率更高。 (内核对象:事件对象、文件对象、I / O完成...

    1.临界区只能用于同一进程内的不同线程之间进行通信,不能用于不同进程之间。

    2.临界区不属于内核对象,只是用户态进行锁操作,调用时不会进入内核态,因此效率更高。

    (内核对象:事件对象、文件对象、I / O完成端口对象、作业对象、信箱对象、互斥对象、管道对象、进程对象、线程对象和等待计时器对象等。这些对象都是通过调用函数来创建的。)

    3.临界区使用了自旋锁。

    展开全文
  • windows临界区

    2014-03-23 20:53:17
    临界区是一种轻量级机制,在某一时间内只允许一个线程执行某个给定代码段。通常在多线程修改全局数据时会使用临界区。事件、信号量也用于多线程同步,但临界区与它们不同,并不总是执行向内核模式的切换,这一转换...

    http://www.cnblogs.com/dsky/p/3155032.html

    临界区:

    临界区是一种轻量级机制,在某一时间内只允许一个线程执行某个给定代码段。通常在多线程修改全局数据时会使用临界区。事件、信号量也用于多线程同步,但临界区与它们不同,并不总是执行向内核模式的切换,这一转换成本昂贵。要获得一个未占用临界区,事实上只需要对内存做出很少的修改,其速度非常快。只有在尝试获得已占用临界区时,它才会跳至内核模式。这一轻量级特性的缺点在于临界区只能用于对同一进程内的线程进行同步。

    临界区由 WINNT.H 中所定义的 RTL_CRITICAL_SECTION 结构表示。 WINBASE.H 后您会发现:

    typedef RTL_CRITICAL_SECTION CRITICAL_SECTION;

    操作临界区的API函数有:

    (1)初始化临界区InitializeCriticalSection

    (2)进入临界区EnterCriticalSection

    (3)离开临界区LeaveCriticalSection

    (4)删除临界区DeleteCriticalSection

    在临界区未被使用的理想情况中,对 EnterCriticalSection 的调用非常快速,因为它只是读取和修改用户模式内存中的内存位置。所阻止的线程以内核模式等待,在该临界区的所有者将其释放之前,不能对这些线程进行调度。如果有多个线程被阻止于一个临界区中,当另一线程释放该临界区时,只有一个线程获得该临界区。

    RTL_CRITICAL_SECTION 结构

    一个进程的临界区是保存于一个链表中,并且可以对其进行枚举。实际上,WINDBG 支持 !locks 命令,这一命令可以列出目标进程中的所有临界区。

    RTL_CRITICAL_SECTION 结构如下:

    struct RTL_CRITICAL_SECTION

    {

        PRTL_CRITICAL_SECTION_DEBUG DebugInfo;

        LONG LockCount;

        LONG RecursionCount;

        HANDLE OwningThread;

        HANDLE LockSemaphore;

        ULONG_PTR SpinCount;

    };

    以下各段对每个字段进行说明。

    DebugInfo 此字段包含一个指针,指向系统分配的伴随结构,该结构的类型为 RTL_CRITICAL_SECTION_DEBUG。这一结构中包含更多极有价值的信息,也定义于 WINNT.H 中。LockCount 这是临界区中最重要的一个字段。它被初始化为数值 -1;此数值等于或大于 0 时,表示此临界区被占用。当其不等于 -1 时,OwningThread 字段包含了拥有此临界区的线程 ID。此字段与 (RecursionCount-1) 数值之间的差值表示有多少个其他线程在等待获得该临界区。

    RecursionCount 此字段包含所有者线程已经获得该临界区的次数。如果该数值为零,下一个尝试获取该临界区的线程将会成功。

    OwningThread 此字段包含当前占用此临界区的线程的线程标识符。此线程 ID 与 GetCurrentThreadId 之类的 API 所返回的 ID 相同。

    LockSemaphore 它是一个内核对象句柄,用于通知操作系统:该临界区现在空闲。操作系统在一个线程第一次尝试获得该临界区,但被另一个已经拥有该临界区的线程所阻止时,自动创建这样一个句柄。应当调用 DeleteCriticalSection(它将发出一个调用该事件的 CloseHandle 调用,并在必要时释放该调试结构),否则将会发生资源泄漏。

    SpinCount 仅用于多处理器系统。MSDN文档对此字段进行如下说明:“在多处理器系统中,如果该临界区不可用,调用线程将在对与该临界区相关的信号执行等待操作之前,旋转 dwSpinCount 次。如果该临界区在旋转操作期间变为可用,该调用线程就避免了等待操作。”旋转计数可以在多处理器计算机上提供更佳性能,其原因在于在一个循环中旋转通常要快于进入内核模式等待状态。此字段默认值为零,但可以用 InitializeCriticalSectionAndSpinCount API 将其设置为一个不同值。

    RTL_CRITICAL_SECTION_DEBUG结构如下:

    struct _RTL_CRITICAL_SECTION_DEBUG

    {

        WORD   Type;

        WORD   CreatorBackTraceIndex;

        RTL_CRITICAL_SECTION *CriticalSection;

        LIST_ENTRY ProcessLocksList;

        DWORD EntryCount;

        DWORD ContentionCount;

        DWORD Spare[ 2 ];

    }

    这一结构由InitializeCriticalSection分配和初始化。它既可以由NTDLL内的预分配数组分配,也可以由进程堆分配。RTL_CRITICAL_SECTION的这一伴随结构包含一组匹配字段,具有迥然不同的角色:有两个难以理解,随后两个提供了理解这一临界区链结构的关键,两个是重复设置的,最后两个未使用。

    下面是对 RTL_CRITICAL_SECTION 字段的说明。

    Type 此字段未使用,被初始化为数值 0。

    CreatorBackTraceIndex 此字段仅用于诊断情形中。在注册表项 HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\YourProgram 之下是 keyfield、GlobalFlag 和 StackTraceDatabaseSizeInMb 值。注意,只有在运行稍后说明的 Gflags 命令时才会显示这些值。这些注册表值的设置正确时,CreatorBackTraceIndex 字段将由堆栈跟踪中所用的一个索引值填充。在 MSDN 中搜索 GFlags 文档中的短语“create user mode stack trace database”和“enlarging the user-mode stack trace database”,可以找到有关这一内容的更多信息。

    CriticalSection 指向与此结构相关的 RTL_CRITICAL_SECTION。图 1 说明该基础结构以及 RTL_CRITICAL_SECTION、RTL_CRITICAL_SECTION_DEBUG 和事件链中其他参与者之间的关系。

     

    图 1 临界区处理流程

    ProcessLocksList LIST_ENTRY 是用于表示双向链表中节点的标准 Windows 数据结构。RTL_CRITICAL_SECTION_DEBUG 包含了链表的一部分,允许向前和向后遍历该临界区。本文后面给出的实用工具说明如何使用 Flink(前向链接)和 Blink(后向链接)字段在链表中的成员之间移动。任何从事过设备驱动程序或者研究过 Windows 内核的人都会非常熟悉这一数据结构。

    EntryCount/ContentionCount 这些字段在相同的时间、出于相同的原因被递增。这是那些因为不能马上获得临界区而进入等待状态的线程的数目。与 LockCount 和 RecursionCount 字段不同,这些字段永远都不会递减。

    Spares 这两个字段未使用,甚至未被初始化(尽管在删除临界区结构时将这些字段进行了清零)。后面将会说明,可以用这些未被使用的字段来保存有用的诊断值。

    总结:

    (1)如果 LockCount 字段有一个不等于 -1 的数值,此临界区被占用,OwningThread 字段包含拥有该临界区的线程的线程标识符。

    (2)如果 RecursionCount 是一个大于 1 的数值,其告知您所有者线程已经重新获得该临界区多少次(也许不必要)。

    (3)LockCount 与 RecursionCount 字段中分别包含其初始值 -1 和 0,这一点非常重要。事实上,对于单线程程序,不能仅通过检查这些字段来判断是否曾获得过临界区。但是,多线程程序留下了一些标记,可以用来判断是否有两个或多个线程试图同时拥有同一临界区。

    (4)在该临界区未被占用时 LockSemaphore 字段中仍包含一个非零值。这表示:在某一时间,此临界区阻止了一个或多个线程。事件句柄用于通知该临界区已被释放,等待该临界区的线程之一现在可以获得该临界区并继续执行。因为 OS 在临界区阻止另一个线程时自动分配事件句柄,所以如果您在不再需要临界区时忘记将其删除,LockSemaphore 字段可能会导致程序中发生资源泄漏。

    (5)在多线程程序中可能遇到的另一状态是 EntryCount 和 ContentionCount 字段包含一个大于零的数值。这两个字段保存有临界区对一个线程进行阻止的次数。在每次发生这一事件时,这两个字段被递增,但在临界区存在期间不会被递减。这些字段可用于间接确定程序的执行路径和特性。例如,EntryCount 非常高时则意味着该临界区经历着大量争用,可能会成为代码执行过程中的一个潜在瓶颈。

    (6)可以通过RTL_CRITICAL_SECTION_DEBUG 中的LIST_ENTRY 遍历进程中的临界区,Flink=NULL为表头,Blink=NULL为表尾。

    (7)利用RTL_CRITICAL_SECTION 的 Spare 字段可以区分我们定义的临界区和系统定义的临界区。

    但是如何知道哪些线程等待某个临界区呢?

    展开全文
  • 临界区与互斥量区别

    2019-09-24 01:44:54
    临界区和互斥锁的区别1、临界区只能用于对象在同一进程里线程间的互斥访问;互斥体可以用于对象进程间或线程间的互斥访问...首先明白临界区是指一段代码,这段代码是用来访问临界资源的。临界资源可以是硬件资源,也...

    临界区和互斥锁的区别
    1、临界区只能用于对象在同一进程里线程间的互斥访问;互斥体可以用于对象进程间或线程间的互斥访问。
    2、临界区是非内核对象,只在用户态进行锁操作,速度快;互斥体是内核对象,在核心态进行锁操作,速度慢。
    3、临界区和互斥体在Windows平台都下可用;Linux下只有互斥体可用

    临界区:

    首先明白临界区是指一段代码,这段代码是用来访问临界资源的。临界资源可以是硬件资源,也可以是软件资源。但它们有一个特点就是,一次仅允许一个进程或线程访问。当有多个线程试图同时访问,但已经有一个线程在访问该临界区了,那么其他线程将被挂起。临界区被释放后,其他线程可继续抢占该临界区。

    临界区是一种轻量级的同步机制,与互斥和事件这些内核同步对象相比,临界区是用户态下的对象,即只能在同一进程中实现线程互斥。因无需在用户态和核心态之间切换,所以工作效率比较互斥来说要高很多。

    互斥量:

    互斥量可以看作是信号量的简化版。是一个内核对象,具有线程拥有权,可以实现进程的同步,线程的互斥访问。

     

    转载于:https://www.cnblogs.com/dynas/p/6792974.html

    展开全文
  • CriticalSection 临界区

    2019-08-14 21:55:59
    临界区(Critical Section): 某些共享资源具有互斥性,也...临界区也有一定的局限性:它只能用于同步单个进程中的线程。在这 里大家得注意一点就是:“在任何的关于同步机制中,不论在哪一个操作系统下,我们都...
  • 临界区和互斥量

    2017-09-25 13:34:46
    1、临界区只能用于对象在同一进程里线程间的互斥访问;互斥体可以用于对象进程间或线程间的互斥访问。 2、临界区是非内核对象,只在用户态进行锁操作,速度快;互斥体内核对象,在核心态进行锁操作,速度慢。 3...
  • CCriticalSection临界区

    千次阅读 2012-08-14 11:06:22
    类CCriticalSection的对象表示一个“临界区”,它一个用于同步的对象,同一时刻只允许一个线程存取资源或代码区。临界区在控制一次只有一个线程修改数据或其它的控制资源时非常有用。例如,在链表中增加一个结点就...
  • MFC线程同步-临界区

    2019-07-27 13:45:00
    临界区概述: 用于多线程的互斥访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入临界区后,其他试图访问的线程将被挂起,直到进入临界区的...(临界区中一般都一个简短的代码段)在WINDO...
  • 临界区的实现原理

    2012-10-01 14:46:00
    临界区概述: 用于多线程的互斥访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入临界区后,其他试图访问的线程将被挂起,直到进入...(临界区中一般都是一个简短的代码段) 在WINDOWS中,临界区是一...
  • 临界区的实现与原理

    千次阅读 2015-11-02 15:31:30
    临界区概述: 用于多线程的互斥访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入...在WINDOWS中,临界区是一种应用层的同步对象,非内核对象。并且临界区优先采用自旋的方式进行抢占 临界区API:
  • 1、临界区只能用于对象在同一进程里线程间的互斥访问;互斥体可以用于对象进程间或线程间的互斥访问。 2、临界区是非内核对象,只在用户态进行锁操作,速度快;互斥体内核对象,在核心态进行锁操作,速度慢。 3、...
  • 互斥量和临界区

    2016-09-02 14:16:16
    critical section 临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 mutex 互斥量:为协调共同对一个共享资源的单独访问...临界区只能用于对象在同一进程里线程间的互斥访问;互斥体
  • ...临界区概述: ...用于多线程的互斥访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入临界区后,其他试图访问的线程将被挂起,直到进入临界区的线程离开。...(临界区中一般都一个简短的代码段)
  • 1、临界区只能用于对象在同一进程里线程间的互斥访问;互斥体可以用于对象进程间或线程间的互斥访问。 2、临界区是非内核对象,只在用户态进行锁操作,速度快;互斥体内核对象,在核心态进行锁操作,速度慢。 3、...
  • 临界区和互斥锁的区别

    千次阅读 2016-12-21 09:42:00
    1、临界区只能用于对象在同一进程里线程间的互斥访问;互斥体可以用于对象进程间或线程间的互斥访问。 2、临界区是非内核对象,只在用户态进行锁操作,速度快;互斥体内核对象,在核心态进行锁操作,速度慢。 3...
  • 临界区介绍三.关于条件的使用 一.互斥锁的介绍 互斥锁用于控制多个线程对他们之间共享资源互斥访问的一个信号量。也就是说为了避免多个线程在某一时刻同时操作一个共享资源。 例如线程池中的有多个空闲线程和一个...
  • 临界区概述: 用于多线程的互斥访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入临界...在WINDOWS中,临界区是一种应用层的同步对象,非内核对象。并且临界区优先采用自旋的方式进行抢占. 临界区API:
  • 临界区的互斥控制

    2008-04-21 15:25:00
    临界区的互斥控制临界区:简述 临界区是一种轻量级机制,在某一时间内只允许一个线程执行某个给定代码段。通常在修改全局数据(如集合类)时会使用临界区。事件、多用户终端执行程序和信号量也用于多线程同步,但...
  • 夸克冷凝物和夸克数密度通常用于确定QCD相变。 然而,在非手性极限的情况下,通常定义的夸克冷凝物发散的,并且在数值计算中,夸克数密度受到表面发散的影响。 为了解决这些问题,我们在有限的温度和密度下重新...
  • CCriticalSection临界区的使用方法

    千次阅读 2016-03-30 10:09:50
    类CCriticalSection的对象表示一个“临界区”,它一个用于同步的对象,同一时刻只允许一个线程存取资源或代码区。临界区在控制一次只有一个线程修改数据或其它的控制资源时非常有用。例如,在链表中增加一个结点就...
  • 多线程通讯--临界区

    2017-05-06 19:35:30
    临界区:一段供县城独占访问的代码,也就是说如果有一线程正在访问该代码段,其他线程必须等该线程离开该代码段方可进入,这样保证了线程安全,他用于用户级(相对于内核级),在windows系统中CRITICAL_SECTION实现临界区...
  • 一、临界区(Critical Section)临界区是指一段独占某些共享资源的访问代码。任意时刻只容许一个线程对共享资源进行访问,如果有多个线程同时访问,那么在一个线程进入临界区后,其他线程只得等待直到该线程离开临界...
  • 只要有一定的内存order保证,不通过比较并交换(CAS)那些需要硬件支持的原子操作,能不能实现一个互斥的临界区?答案是:能。 计算机先驱djkstra,50多年前的这篇经典paper中就提出了解决方案。...临界区是critical

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 603
精华内容 241
关键字:

临界区是用于