实现简单线程安全通用互斥锁的正确方法
Correct way to implement simple thread safe generic mutex
我想知道我实现通用互斥锁的方式是否是一种好的软件设计模式,它是否线程安全?
这是我的互斥类:
#ifdef HAVE_WINDOWS_H
void *CSimpleMutex::object;
#endif
#ifdef _PTHREADS
pthread_mutex_t CSimpleMutex::object;
#endif
CSimpleMutex::CSimpleMutex(bool lockable)
{
isLockableMutex = lockable;
if (!lockable)
{
#ifdef _WINDOWS
object = CreateMutex(NULL, false, NULL);
#endif
#ifdef _PTHREADS
pthread_mutex_init(&object, NULL);
#endif
}
else
{
#ifdef _WINDOWS
InitializeCriticalSection(&mutex);
#endif
#ifdef _PTHREADS
pthread_mutex_init(&mutex, NULL);
#endif
}
}
CSimpleMutex::~CSimpleMutex()
{
if (!isLockableMutex)
{
#ifdef _WINDOWS
if(object!=NULL)
{
CloseHandle(object);
}
#endif
#ifdef _PTHREADS
pthread_mutex_destroy(&object);
#endif
}
else
{
#ifdef _WINDOWS
DeleteCriticalSection(&mutex);
#endif
#ifdef _PTHREADS
pthread_mutex_destroy(&mutex);
#endif
}
}
// Aquires a lock
void CSimpleMutex::Lock()
{
if (!isLockableMutex)
return;
#ifdef _WINDOWS
EnterCriticalSection(&mutex);
#endif
#ifdef _PTHREADS
pthread_mutex_lock(&mutex);
#endif
}
// Releases a lock
void CSimpleMutex::Unlock()
{
if (!isLockableMutex)
return;
#ifdef _WINDOWS
LeaveCriticalSection(&mutex);
#endif
#ifdef _PTHREADS
pthread_mutex_unlock(&mutex);
#endif
}
它是这样使用的:
class CEnvironment : public CHandleBase
{
private:
CSimpleMutex *mutex;
public:
CEnvironment(){mutex = new CSimpleMutex(true);};
~CEnvironment(){delete mutex;};
void Lock() { mutex->Lock(); };
void Unlock() { mutex->Unlock(); };
void DoStuff(void *data);
};
当我想使用CEnvironment时,我会做这样的事情:
env->Lock();
env->DoStuff(inData);
env->Unlock();
通常使用 RAII 分别在进入和离开给定作用域时获取和释放锁,以便在该作用域内引发异常时自动释放锁。 在您的情况下,您可以定义一个附加锁"guard"类,该类在其构造函数中获取锁并在其析构函数中释放。 例如,C++11 标准定义了几个互斥类和一个提供我刚才描述的行为的std::lock_guard
类。
Doug Schmidt 撰写的论文"策略锁定、线程安全接口和作用域锁定"提供了可能有用的其他设计细节和想法。
相关文章:
- 在C/C++中执行"_dl_init"(程序初始化)是单线程的吗
- 特定对象文件的单线程生成
- 如何在类中同时运行某些内容(在单线程平台中)?
- GDB 8.1 无法在单线程简单程序中跟踪 std::string 变量的值
- 双线程应用比单线程应用慢 C++ (VC++ 2010 Express).如何解决?
- OpenMP:共享同一算法的单线程和多线程实现
- std::原子布尔值或普通全局布尔值在单线程中很好吗?
- 重写多线程事件驱动的C 程序以使用单线程Boost :: Asio
- C++多线程操作比单线程慢
- 多线程和单线程代码维护
- 线程池的计时测试:单线程 vs 回调 tp vs 未来 tp
- 在 Linux 中从单独的单线程进程生成多线程进程时出现问题
- C++多线程性能比单线程代码慢
- 即使在单线程程序中,共享指针是否在引用计数中使用原子操作
- 从单线程到多线程图像处理
- 当发送多个同时请求时,单线程异步系统中Beast Boost异步HTTP客户端的行为
- 在单线程中使用 asio::async_write 时获得"the requested resource is in use"
- 在C++中,如何在并发读取和锁定的单线程写入uncodered_map之间进行交替
- wxWidgets-单线程多任务处理
- 有没有一种方法可以用单线程版本库编译多线程c++程序?