让我说我正在实现一个关键部分并在VC ++中保护一些数组,我该如何在VC ++中使用锁?
答案 0 :(得分:10)
您需要critical sections的API函数:
InitializeCriticalSection
从任何线程(通常是主线程)调用一次来初始化锁。在用它做任何其他事情之前进行初始化。EnterCriticalSection
从任何线程调用以获取锁定。如果另一个线程有锁,它将阻塞,直到它可以获得锁。关键部分是可重入的,这意味着即使线程已经拥有它,线程也会成功获取锁定。LeaveCriticalSection
释放锁定。每次拨打EnterCriticalSection
的电话都必须与对LeaveCriticalSection
的匹配电话配对。不要让异常停止这些获取/释放呼叫配对。DeleteCriticalSection
从任何线程(通常是主线程)调用一次,以完成锁定。当没有线程持有锁时执行此操作。在您调用此锁之后,锁无效,您无法再次尝试获取锁。MSDN有助于提供trivial example。
如果您使用的是MFC,那么您可能会使用CCriticalSection
来封装类中的Win32关键部分API。
至于你如何使用你的阵列。好吧,你的线程一次只能执行一个受锁保护的代码块。您需要使用锁来停止竞争条件,其中两个线程同时尝试读取/写入同一内存位置,或者实际上其他更微妙的条件可能会破坏您的算法。
如果您要描述数组,其内容以及如何操作它,那么可能会给您一些具体的建议。究竟如何操作此阵列将对理想的同步策略产生重大影响,在某些情况下,您可以使用无锁方法。
答案 1 :(得分:2)
通过CreateMutex创建互斥锁,通过WaitForSingleObject获取互斥锁,通过ReleaseMutex释放互斥锁的所有权,并在完成CloseHandle后将其删除。
您可以查找的备选方案包括CriticalSections,Semaphores和Events。
答案 2 :(得分:0)
如果您使用的是VS 2010,则头文件ppl.h中会包含criticial_section
个对象。
请注意,还有一个同步的concurrent_vector
类模板(即不需要锁定)。