线程同步的方法

Win32一个最容易的同步机制是critical sections,用来处理一份共享之资源。Critical Sections并不是核心对象,存在于进程的内存空间中。

InitializeCriticalSection(),EnterCriticalSection(),LeaveCriticalSection(),DeleteCriticalSection(),你应该在每一个存取 全局数据的地方使用

Enter/Leave函数。一旦一个线程 进入一个Critical Section,它就能够一再地重复 进入该Critical Section,唯一的警告就是,每一个“进入”操作

都必须有一个对应的“离开”操作。最牢靠而最立即的警告:千万不要在一个Critical Section之中调用Sleep()或任何Wait...()API函数。Critical

Section的一个缺点就是,没有办法获知进入Critical Section中的那个线程是生是死,如果进入Critical Section的那个线程结束了或当掉了,而没有调用LeaveCriticalSection()的话,就会产生Dangling Critical Sections .任何时候当一段代码需要两个(或更多)资源时,都有潜在性的死锁阴影。对大部分而言,最好的政策就是找出一种方法以确保死锁 不会发生,强迫资源锁定,使它们成为“all or nothing”.由于Dangling

Critical Section 和 死锁问题,引入了 Mutex.

 

mutex是Mutual Exclusion的缩写,虽然mutex和critical Section做相同的事情,但是它们的运作有差别的:1.mutex锁住时间是锁住critical

section的100倍。2.Mutex可以跨进程使用。3.mutex可以指定“结束等待”的时间长度. CreateMutex(), OpenMutex(),

WaitForSingleObject(),WaitForMultipleObjects(),MsgWaitForMultipleObjects(), ReleaseMutex(),CloseHandle().一旦没有任何线程拥有

mutex,这个mutex便处于激发状态,线程拥有mutex时,它便处于不激活状态。mutex有一个非常重要的特性,这性质在各种同步机制中是

独一无二的,如果线程拥有一个mutex而在结束前没有调用RealseMutex(),mutex不会被摧毁,取而代之的是,该mutex会被视为"未被拥有"以及"未被激发",而下一个等待中的线程会被以WAIT_ABANDONED_0 -WAIT_ABANDONED_0_N+1 通知。

 

Semaphores是解决各种productor/consumer问题的关键要素,这种问题会存在一个缓冲区,可能在同一时间内被读出数据或写入数据。理论可以证明:mutex是semaphore的一种退化。如果你产生一个semaphore并令最大值为1,那就是一个mutex。也因此,mutex又常被称为binary semaphore.但semaphores不象mutexes,它并没有所谓的"wait abandoned"状态可以被其他线程侦测到。Semaphore的现值意义是目前可用的资源数。CreateSemaphore(), WaitForSingleObject(),WaitForMultipleObjects(),MsgWaitForMultipleObjects(),

ReleaseSemaphore(),与mutex不同的是,调用ReleaseSemaphore()的那个线程,并不一定就的是调用Wait...()的那个线程。任何线程都可以在任何时间调用ReleaseSemaphore(),接除被任何线程锁定的Semaphore.

 

Win32中最具弹性的同步机制就属Events对象了。CreateEvent(),SetEvent(),ResetEvent(),PulseEvent().

 

同步机制的最简单类型是使用Interlocked函数。这些函数没有提供“等待”机能,它们只是保证对某个特定变量的存取操作是“一个一个接顺序来”。InterlockedIncrement(),InterlockedDecrement(),这两个函数都只能够和0做比较,不能和任何其他数值比较。InterlockedExchange(),

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值