您的位置:首页 > 其它

windows-用户模式下的线程同步(整理)

2013-06-03 23:23 197 查看

1.原子访问:互锁函数族

1.1 互锁函数的机运行方式

互锁函数的运行取决于函数运行的处理器平台,对于x86系列的处理器来说,互锁函数会向总线发出一个硬件信号,防止其他处理器访问同一个内存地址。而在alpha处理器平台上,互锁函数能之行下列操作:

(1)打开处理器的一个特俗的标志位,并标明被访问的内存地址。

(2)将内存的值读入一个寄存器

(3)修改该寄存器

(4)如果CPU中的特殊位标志是关闭的,则转入第二步。否则,特殊位标志仍然是打开的,就将寄存器的值重新存入内存。

1.2 主要的互锁函数

LONG InterLockedExchangeAdd(PLONG plAddend,LONG lIncrement; //增加或减少pladdend,取决于第二个参数的符号

LONG InterLockedExchange(PLONG plTarget, LONG lValue);(32位/64位下可替代32位值)

LONG InterLockedExchangePointer(PVOID* ppvTarget, PVOID pvValue);(32位下可替代32位值,64位下只能替代64位值)

这两个函数用第二个参数的值代替第一个参数的值,返回原始值。InterLockedExchange在循环锁实现中是非常有用的。但是会浪费CPU时间,所以要小心使用。

POVID InterLockedCompareExchange(PLONG plDestination, LONG lExchange, LONG lComparand);(32位下替代32位值,64位下替代64位值)

POVID InterLockedCompareExchangePointer(PVOID* ppvDestination, PVOID pvExchange, PVOID pvComparand);(32位、64位下替代32位值)

这两个函数负责执行一个原子测试和设置操作。

2.临界区

2.1 定义

临界区是指一小段代码,在代码能够执行前,它必须独占对一些共享资源的访问权,是让若干行代码能够”能够以原子操作方式“来使用资源的一种方法

注意问题:

(1)当拥有一项可以供多个线程访问的资源时,应该创建CRITICAL_SECTION结构。每一个共享资源都应该创建一个独立的上述结构。

(2)无论在何处拥有需要访问资源的代码,都必须调用EnterCriticalSection函数,并传递标示该资源的CRITICAL_SECTION结构地址。

(3)当使用资源完毕,调用LeaveCriticalSection函数,告诉系统资源使用完毕

优点和缺点:

(1)使用简单,在内部使用互锁函数,能够迅速运行

(2)无法对多个进程中的各个线程进行同步

2.2 使用

使用要求:

(1)需要所有访问该资源的线程都知道CRITICAL_SECTION结构的地址

(2)使用前必须使用VOID InitializeCriticalSection(PCRITICAL_SECTION pcs);进行初始化

(3)当不再使用该资源时,调用VOID DeleteCriticalSection(PCRITICAL_SECTION pcs);来清除这个结构。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐