线程互斥和同步(一简介)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010855021/article/details/75137184

线程互斥和同步——概念

一:基础概念

    进程是资源分配的基本单位;线程是系统调度的基本单位。平时我们写的程序都是作为线程运行的;进程可以看做是包括一系列线程和资源的统称;一个进程至少包括一个线程(主线程,进入main函数时产生的);在其中可以创建其它线程,也可以不创建。同一进程间的线程究竟共享哪些资源呢,而又各自独享哪些资源呢?

 

共享资源

a.  由于堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;因此new出来的都是共享的(16位平台上分全局堆和局部堆,局部堆是独享的)

b. 全局变量 它是与具体某一函数无关的,所以也与特定线程无关;因此也是共享的

c. 静态变量 虽然对于局部变量来说,它在代码中是“放”在某一函数中的,但是其存放位置和全局变量一样,存于堆中开辟的.bss.data段,是共享的

d. 文件等公用资源  这个是共享的,使用这些公共资源的线程必须同步。Win32提供了几种同步资源的方式,包括信号、临界区、事件和互斥体。

独享的资源有

a. 栈 栈是独享的

扫描二维码关注公众号,回复: 4727731 查看本文章

b. 寄存器  这个可能会误解,因为电脑的寄存器是物理的,每个线程去取值难道不一样吗?其实线程里存放的是副本,包括程序计数器PC

 

临界资源

  是指每次仅允许一个进程访问的资源。属于临界资源的硬件有打印机、磁带机等,软件有消息缓冲队列、变量、数组、缓冲区等。  诸进程间应采取互斥方式,实现对这种资源的共享。

  每个进程中访问临界资源的那段代码称为临界区。显然,若能保证诸进程互斥地进入自己的临界区,便可实现诸进程对临界资源的互斥访问。为此,每个进程在进入临界区之前,应先对欲访问的临界资源进行检查,看它是否正被访问。如果此刻该临界资源未被访问,进程便可进入临界区对该资源进行访问,并设置它正被访问的标志;如果此刻该临界资源正被某进程访问,则本进程不能进入临界区

二、什么是线程互斥和同步

线程之间通信的两个基本问题是互斥和同步:

    线程同步:是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。

    线程互斥是指对于共享的操作系统资源(指的是广义的"资源",而不是Windows.res文件,譬如全局变量就是一种共享资源),在各线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。

  线程互斥是一种特殊的线程同步。实际上,互斥和同步对应着线程间通信发生的两种情况:

(1)当有多个线程访问共享资源而不使资源被破坏时;

(2)当一个线程需要将某个任务已经完成的情况通知另外一个或多个线程时。

 

从大的方面讲,线程的同步可分用户模式的线程同步和内核对象的线程同步两大类。用户模式中线程的同步方法主要有原子访问和临界区等方法。其特点是同步速度特别快,适合于对线程运行速度有严格要求的场合。


猜你喜欢

转载自blog.csdn.net/u010855021/article/details/75137184