2

假设我正在实现一个关键部分并在 VC++ 中保护一些数组,我如何使用 VC++ 中的锁来做到这一点?

4

3 回答 3

10

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

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

MSDN 提供了一个简单的示例

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

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

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

于 2011-02-19T23:30:05.690 回答
2

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

您可以查找的替代方案包括CriticalSectionsSemaphoresEvents

于 2011-02-19T23:12:00.400 回答
0

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

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

于 2011-02-20T00:08:37.817 回答