如何在VC ++中创建锁?

时间:2011-02-19 23:07:21

标签: windows multithreading winapi visual-c++ locks

让我说我正在实现一个关键部分并在VC ++中保护一些数组,我该如何在VC ++中使用锁?

3 个答案:

答案 0 :(得分:10)

您需要critical sections的API函数:

  • InitializeCriticalSection从任何线程(通常是主线程)调用一次来初始化锁。在用它做任何其他事情之前进行初始化。
  • EnterCriticalSection从任何线程调用以获取锁定。如果另一个线程有锁,它将阻塞,直到它可以获得锁。关键部分是可重入的,这意味着即使线程已经拥有它,线程也会成功获取锁定。
  • LeaveCriticalSection释放锁定。每次拨打EnterCriticalSection的电话都必须与对LeaveCriticalSection的匹配电话配对。不要让异常停止这些获取/释放呼叫配对。
  • DeleteCriticalSection从任何线程(通常是主线程)调用一次,以完成锁定。当没有线程持有锁时执行此操作。在您调用此锁之后,锁无效,您无法再次尝试获取锁。

MSDN有助于提供trivial example

如果您使用的是MFC,那么您可能会使用CCriticalSection来封装类中的Win32关键部分API。

至于你如何使用你的阵列。好吧,你的线程一次只能执行一个受锁保护的代码块。您需要使用锁来停止竞争条件,其中两个线程同时尝试读取/写入同一内​​存位置,或者实际上其他更微妙的条件可能会破坏您的算法。

如果您要描述数组,其内容以及如何操作它,那么可能会给您一些具体的建议。究竟如何操作此阵列将对理想的同步策略产生重大影响,在某些情况下,您可以使用无锁方法。

答案 1 :(得分:2)

通过CreateMutex创建互斥锁,通过WaitForSingleObject获取互斥锁,通过ReleaseMutex释放互斥锁的所有权,并在完成CloseHandle后将其删除。

您可以查找的备选方案包括CriticalSectionsSemaphoresEvents

答案 2 :(得分:0)

如果您使用的是VS 2010,则头文件ppl.h中会包含criticial_section个对象。

请注意,还有一个同步的concurrent_vector类模板(即不需要锁定)。