使用 CriticalSection 创建类似互斥锁的程序
Posted
技术标签:
【中文标题】使用 CriticalSection 创建类似互斥锁的程序【英文标题】:Creating a mutex like program using CriticalSection 【发布时间】:2011-04-13 08:44:28 【问题描述】:例如
EnterCriticalSection ( cs );
LeaveCriticalSection ( cs );
我想创建一个函数来锁定它,如果调用你的函数调用或离开对象,则释放它。
如何开始上课?
【问题讨论】:
【参考方案1】:所以是一个作用域的关键部分?
class ScopedCriticalSection
CRITICAL_SECTION cs;
ScopedCriticalSection()
if (!InitializeCriticalSectionAndSpinCount(&cs, 0x00000400))
throw std::runtime_error("Could not initialise CriticalSection object");
EnterCriticalSection(&cs);
~ScopedCriticalSection()
LeaveCriticalSection(&cs);
DeleteCriticalSection(&cs);
;
void foo()
ScopedCriticalSection scs;
/* code! */
或consider a Boost mutex。
【讨论】:
您的构造函数将LPCRITICAL_SECTION
作为参数,但您的代码中缺少该参数。【参考方案2】:
您可以将关键部分包装在具有公共函数 acquire
和 release
的 Mutex
类中,并让第二个名为 ScopedLock
的类在构造时获取互斥锁并在销毁时释放它。
互斥体:
class Mutex
public:
Mutex()
//TODO: create cs
~Mutex()
//TODO: destroy cs
void acquire()
EnterCriticalSection(cs);
void release()
LeaveCriticalSection(cs);
private:
LPCRITICAL_SECTION cs;
Mutex(const Mutex&); //non-copyable
Mutex& operator=(const Mutex&); //non-assignable
;
锁:
class ScopedLock
public:
ScopedLock(Mutex* mutex_) : mutex(mutex_)
mutex->acquire();
~ScopedLock()
mutex->release();
private:
Mutex* mutex;
;
像这样使用它:
Mutex someMutex;
void foo()
ScopedLock lock(&someMutex);
//critical stuff here
void bar()
ScopedLock lock(&someMutex);
//other critical stuff here
【讨论】:
以上是关于使用 CriticalSection 创建类似互斥锁的程序的主要内容,如果未能解决你的问题,请参考以下文章