精华内容
下载资源
问答
  • 本文主要讨论多线程访问中临界区形成的问题,从本质上讲,临界区的形成是在多线程中,不同的线程访问和操作同一片内存,而形成的。在具体分析之前,我们先来看一个多线程的列子: #include #include int num=0; ...
            本文主要讨论多线程访问中临界区形成的问题,从本质上讲,临界区的形成是在多线程中,不同的线程访问和操作同一片内存,而形成的。在具体分析之前,我们先来看一个多线程的列子:
    #include<stdio.h>
    #include<pthread.h>
    int num=0;
    void* pthread_main1()
    {
        int i=0;
        for(i=0;i<1000000000;i++)
        {
             num++;
        }
    }
    
    void* pthread_main2()
    {
        int i=0;
        for(i=0;i<1000000000;i++)
        {
            num--;
        } 
    }
    int main()
    {
        int i=0;
        pthread_t pid[2];
        pthread_create((void*)&(pid[0]),NULL,(void*)pthread_main1,NULL);
        pthread_create((void*)&(pid[1]),NULL,(void*)pthread_main2,NULL);
        for(i=0;i<2;i++)
        {
            pthread_join(pid[i],NULL);
        }
        printf("%d\n",num);
        return 0;
    }
    
    

            我们分别定义了两个线程函数pthread_main1和pthread_main2,在函数中分别对全局变量num进行++和--操作,且操作次数一致,num的初始值是0,最后在主函数中打印结果时,num的值会不会变成0呢?
           答案肯定是不会,因为有临界区的存在,我们先来看下运行的结果:
    [Hyman@Hyman-PC multithread]$ gcc ts3.c -D_REENTRANT -lpthread
    [Hyman@Hyman-PC multithread]$ ./a.out 
    -507431
    [Hyman@Hyman-PC multithread]$ 

            下面我们就根据这个例子来分析下临界区的产生过程。首先,我们先分析下在线程函数中num++和num--过程中,因为++和--在操作过程中表现是一样的,所以以++为例进行分析:
     第一步,num是存放在内存的全局数据段中的,++操作时操作系统先把num的值存放到CPU的寄存器中。
    第二步,CPU负责计算,将num的值加1.
    第三步,操作系统又把寄存器已经加1的值写会到num所在的内存中。
            我们期望的方式是在线程1中上述三步全部完成后,再执行线程2中num--的操作,这样最后得到的结果就会是期望值0。
    但事实时,也许执行到第一步或者第二步的时候就开始执行num--的操作了。比如:num的初始值是0,当执行到num++的第二步时,num将要被执行第三步变成1之前,线程2开始执行num--的代码,而且执行完成了num--的三个步骤,此时num变成了-1,而这时开始执行num++的第三步,将寄存器中的1写入到了num的内存中,显然现在num又变成1。在分别执行num++和num--之后,num变成了1,显然这并不是我们期望的。
            这就是临界区的形成,它不是变量num,而是一段代码num++和num--。让我们再总结一下,它的形成条件:
    1、多个线程同时访问一片内存,并企图修改这片内存(在例子里就是num所在的内存)。

    2、修改片内存是通过多步骤的操作完成的(实际上这是必然存在的条件,因为我们只要想修改这片内存的内容,操作系统就会分步骤完成,不会一蹴而就)。


    Github位置:
    https://github.com/HymanLiuTS/NetDevelopment
    克隆本项目:
    Git clone git@github.com:HymanLiuTS/NetDevelopment.git
    获取本文源代码:
    git checkout NL37



    展开全文
  • 临界区是进程访问临界资源的那段代码。按照我的理解,临界资源有很多种,所以一个进程有可能会有很多个临界区,分别用来访问不同的临界资源。 这些临界区中,有的是用来访问操作系统内核中的数据结构或数据的,比如...

    临界区是进程访问临界资源的那段代码。按照我的理解,临界资源有很多种,所以一个进程有可能会有很多个临界区,分别用来访问不同的临界资源。
    这些临界区中,有的是用来访问操作系统内核中的数据结构或数据的,比如系统时钟(猜的),等等,叫做内核程序临界区。
    进程访问临界资源时,临界区会上锁,然后其他进程临界区就不能访问同一个临界资源了。然而内核临界资源很重要!不可以长时间被同一个进程占用,所以访问内核临界资源时,不可以进行进程切换,等到进程退出临界区后才可以。
    普通临界资源就是像普通I/O设备什么的,比如,打印机,进程访问这些资源的时候,很慢,会自动阻塞,等待资源使用完成。

    展开全文
  • 临界区

    2015-04-24 08:17:09
    临界区是一种防止多个线程同时执行一个特定代码段的机制。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他试图访问此临界区的线程将被挂起,并一直持续到临界区的线程离开。 **临界区适用于多个线程...

    临界区是一种防止多个线程同时执行一个特定代码段的机制。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他试图访问此临界区的线程将被挂起,并一直持续到临界区的线程离开。
    临界区适用于多个线程之间没有先后顺序但要求互斥的同步。

    1. 定义临界区变量:
      CRITICAL_SECTION criticalSection;

    2. 初始化临界区
      VOID WINAPI InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

    3. 删除临界区
      VOID WINAPI DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

    4. 进入临界区
      VOID WINAPI EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

    5. 离开临界区
      VOID WINAPI LeavesCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
      使用临界区编程的一般方法:
      void WriteData(){
      EnterCriticalSection(&gCriticalSection);
      //do something
      LeaveCriticalSection(&gCriticalSection);
      }

    展开全文
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼函数多线程。临界区多线程脚本中,临界区有啥作用TC的临界...E的叫法是:进入许可证/许可区365是的啊 :临界区是lock,一种锁。避免多个线程,抢夺改写同一个全局变量。...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

    函数多线程。临界区

    多线程脚本中,临界区有啥作用

    TC的临界区,跟易的线程许可区一样?

    jrflsh :

    嗯,线程要进入临界区,需要挂号排队。一个出来了,另外一个线程才能进去。

    jimye0526 :

    CriticalSection,翻译过来就是“临界区”。E的叫法是:进入许可证/许可区

    365是的啊 :

    临界区是lock,一种锁。避免多个线程,抢夺改写同一个全局变量。例子:

    var ret序号

    功能 线程1()

    lock

    for(var i=0; i<10; i++)

    ret序号 = i

    end

    unlock

    结束

    功能 线程2()

    lock

    for(var i=10; i<20; i++)

    ret序号 = i

    end

    unlock

    结束

    新手 :

    在多线程中,两个线程同时查找同一个图片,会卡机吗?多个线程同时查找同一个图片,会卡机吗?

    365是的啊: 不会

    =======================================================

    稳定。 :

    //先上代码。

    var 句柄, hThread1, hThread2, hThread3

    功能 启动_热键()

    句柄 = 临界区创建()

    var bool = 线程获取状态(hThread1)

    if(bool == 0)

    hThread1 = 线程开启("线程1", "")

    hThread2 = 线程开启("线程2", "")

    hThread3 = 线程开启("线程3", "")

    end

    结束

    功能 终止_热键()

    线程关闭(hThread1)

    线程关闭(hThread2)

    线程关闭(hThread3)

    临界区删除(句柄)

    结束

    功能 线程1()

    临界区进入(句柄)

    for(var i=0; i<10; i++)

    鼠标移动(*, *)

    sleep(100)

    鼠标左键单击()

    sleep(100)

    end

    临界区离开(句柄)

    结束

    功能 线程2()

    临界区进入(句柄)

    for(var i=0; i<10; i++)

    鼠标移动(*, *)

    sleep(100)

    鼠标左键单击()

    sleep(100)

    end

    临界区离开(句柄)

    结束

    功能 线程3()

    临界区进入(句柄)

    //

    临界区离开(句柄)

    结束

    =======================================================

    稳定。 :

    TC的临界区,在按键精灵叫互斥体,在易语言叫许可证。

    临界区,就是设置一个服务区,线程办理业务,需要挂号排队。避免多个线程,争夺同一资源,使0x********内存地址不能为read.

    .

    用银行业务来举例,

    临界区创建(),在银行区域,划分几个服务区(柜台)。

    临界区进入(句柄),这句命令包括三个步骤:到银行挂号,等待叫号,办理业务。

    临界区离开(句柄),用户离开服务区(柜台)。

    临界区删除(句柄),回收系统资源。

    .

    前台鼠标只有一个。多个线程 绑定同一个游戏窗口,多个线程抢用前台鼠标,线程_临界区就派上用场。相关教程:

    【深入浅出篇】第五课 TC线程

    【深入浅出篇】第六课 临界区的使用

    【深入浅出篇】第七课 消息路由和消息过程

    展开全文
  • 什么是临界资源和临界区

    万次阅读 多人点赞 2016-12-29 16:22:45
    1.临界资源  临界资源是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式,实现共享的资源称作临界... 每个进程中访问临界资源的那段代码称为临界区(criticalsection),每次只允许一个进程进入临界区
  • 临界区管理

    2015-09-18 21:39:28
    1.临界区临界区是指必须以互斥的方式执行的代码段,也就是说临界区范围内只能由一个活动的线程。例如:修改共享变量的过程中其他的执行线程可能会访问共享变量,那么修改共享变量的代码就被看成是临界区的一部分。...
  • 临界区、相关临界区

    千次阅读 2017-10-09 09:10:27
    1.概念   临界区:每个进程中访问临界资源的那段代码称为临界区(Critical Section) 临界资源:临界资源是一次仅允许...相关临界区:多个进程中涉及到同一个临界资源的临界区称为相关临界区。 百度百科上对临界
  • 临界区是用于保护线程之间调用互斥的机制,主要是为了保护线程内的资源不会被其他线程抢占。 临界资源时临界区内的代码。 2、实现临界资源的几种方式 调度器锁、中断、信号量、互斥量 调度器锁 主要是控制调度器的...
  • 临界区的互斥

    2019-05-21 01:21:43
    临界区是共享的资源(如共享文件,共享变量,全局变量等)进行访问的一段程序代码。访问共享的内存是临界区和其他代码相区别的地方,当计算机中运行的多个进程都有执行临界区的代码的时候,这个时候就会出现对共享...
  • windows临界区

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

    2019-10-03 14:41:21
    临界区是访问共享数据的代码块。 线程安全,线程共享数据的安全访问。 线程安全:对共享资源的有序访问。 http://www.cnblogs.com/wind-net/archive/2012/08/29/2661693.html 每个进程中访问临界资源的那段代码...
  • 什么是临界区

    2017-07-17 11:34:54
    临界区[1] 指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个线程访问的特性。当有线程进入临界区段时,其他线程或是进程必须等待(例如:bounded waiting ...
  • 临界区 CRITICAL_SECTION

    2020-07-13 11:20:01
    1 声明临界区 CRITICAL_SECTION m_stLocker; 2 初始化临界区: ::InitializeCriticalSection(&m_stLocker); 3 释放临界区: ::DeleteCriticalSection(&m_stLocker); 4 使用临界区: ...临界区是.
  • 临界资源和临界区

    2021-02-19 13:04:57
    每个进程中访问临界资源的那段代码称为临界区(criticalsection),每次只允许一个进程进入临界区,进入后,不允许其他进程进入。不论是硬件临界资源还是软件临界资源,多个进程必须互斥的对它进行访问。多个进程...
  • 临界区的概念

    千次阅读 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: ...临界区是IDS...
  • delphi临界区

    千次阅读 2012-08-14 17:47:53
    线程同步有多种办法,使用临界区是其中最简单,也是效率最高的办法(CPU占用时间最少) 使用临界区代码如下: 先声明一个TRTLCriticalSection类型的全局变量 var  MyCs:TRTLCriticalSection; 在程序开始

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,674
精华内容 2,669
关键字:

临界区是