假设我正在实现一个关键部分并在 VC++ 中保护一些数组,我如何使用 VC++ 中的锁来做到这一点?
问问题
3403 次
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时将其删除。
您可以查找的替代方案包括CriticalSections、Semaphores和Events。
于 2011-02-19T23:12:00.400 回答
0
如果您使用的是 VS 2010,criticial_section
则头文件 ppl.h 中包含一个对象。
请注意,还有一个concurrent_vector
同步的类模板(即不需要锁)。
于 2011-02-20T00:08:37.817 回答