您好、欢迎来到现金彩票网!
当前位置:2019正版免费全年资料 > 同步通信量 >

Win32多线程通信

发布时间:2019-06-26 20:36 来源:未知 编辑:admin

  同步是指线程之间具有制约关系,一个线程的执行依赖另一个线程,当未得到另一个线程的消息时而处于等待。

  互斥是指在使用共享资源时,各线程访问的排他性。当多个线程请求使用同一共享资源时,任意时刻最多只允许一个线程去使用,其他需要使用该资源的线程必须要等待,直到占用资源的线程释放该资源。

  根据示意图可以看出:线程互斥是一种特殊的线程同步。实际上,线程互斥和同步对应着线程通信中的两种情况:

  进程中所有线程均可以访问所有的全局变量,因而全局变量成为Win32多线程通信的最简单方式。

  当主线程必须使自己与threadFunction函数的完成运行实现同步时,它并未使自己进入睡眠状态。由于主线程未进入睡眠状态,因此操作系统继续为它调度CPU时间,这就要其他线程宝贵的时间周期。

  当主线程的优先级高于执行threadFunction函数的线程时,会放生globalFlag永远不被赋值为true的情况。因为在这种情况下,系统不会再将时间片分配给要执行threadFunction函数的线程。

  事件(Event)事件是Win32提供的最灵活的线程同步方式,事件可以处于激发状态(signaled or true)或者未激发状态(unsignal or false)。根据状态变迁方式的不同,事件可以分为两类:

  若跨进程访问事件,必须对事件命名。命名时,不要与命名空间中其他全局对象命名冲突;

  由于事件属于内核对象,故进程B通过对象名称可以调用OpenEvent函数获得进程A中事件对象的句柄,然后根据该句柄可用于ResetEvent、SetEvent和WaitForMultipleObject等函数。这样就可以实现一个进程的线程控制另一个进程的线程的运行。

  信号量(Semaphore)信号量是维护 O 到指定最大值之间的同步对象。信号量状态在其计数大于 O 时是有信号的,而其计数是 O 时是无信号的。信号量对象在控制上可以支持有限数量共享资源的访问。

  不要长时间运行关键代码段。当一个关键代码段长时间运行时,其他线程就会进入等待状态,这样会降低程序运行性能;

  若需要同时访问多个资源,则可能连续调用EnterCriticalSection;

  临界区不是操作系统内核对象,若进入临界区的线程崩溃了,将无法释放临界区资源。这个缺点在互斥量中得到了弥补。

  互斥量(Mutex)互斥量的作用是保证每次只能有一个线程获得互斥量而得以继续执行

  互斥量是内核对象,可以跨进程访问,下面的代码给出从另一进程访问命名为“MyMutex”的互斥量:

  互斥对象能够保证线程拥有对单个资源的互斥访问权。互斥对象的行为特征与临界区相同,但互斥对象属于内核对象,而临界区则属于用户定义方式对象,因此导致互斥量与临界区之间的不同:

  所谓原子访问,是指线程在访问资源时能够确保所有其他线程都不在同一时间内访问相同的资源。

  在[#0]指令与[#1]指令之间,[#1]指令与[#2]指令之间,都可能发生线程切换,使得程序执行后globalValue的值不能确定。我们可以使用InterlockedExchangeAdd函数解决这个问题:

  InterlockedExchangeAdd函数保证变量globalValue的访问具有“原子性”。互锁访问的控制速度非常快,调用一个互锁函数的CPU通常小于50,不需要进行用户方式与内核方式的切换,而这种切换通常需要运行1000个CPU周期。

  互锁访问函数的缺点是只能对单一变量进行原子访问。如果要访问的资源比较复杂,仍需要使用临界区或者互斥量。

  可等待定时器是在某个时间或者按规定的时间间隔发出信号通知的内核对象。它们通常用来在某个时间执行某个操作。

http://disyu.com/tongbutongxinliang/391.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有