如何在VC ++中创build锁?

比方说,我正在实施一个关键的部分,并保护VC ++中的一些数组,我怎么在VC ++中使用

Solutions Collecting From Web of "如何在VC ++中创build锁?"

您需要关键部分的API函数:

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

MSDN帮助提供一个简单的例子 。

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

至于你如何做你的数组。 那么,你的线程将一次只执行一个由锁保护的代码块。 你需要锁来停止两个线程同时读/写同一个内存位置的竞态条件,或者其他更微妙的条件,这些条件可能会破坏你的算法。

如果要描述数组,其内容以及如何操作,那么可能会给出一些具体的建议。 在这个阵列上的操作方式对理想的同步策略有很大的影响,在某些情况下,您可以使用无锁的方法。

通过CreateMutex创建一个互斥锁,通过WaitForSingleObject获取它的所有权,通过ReleaseMutex释放互斥量的所有权,并在完成CloseHandle时删除它。

您可以查找的替代方案包括CriticalSections , Semaphores和Events 。

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

注意还有一个concurrent_vector类模板(即不需要锁)。