C++开发过程多线程同步lock的实现
在程序开发过程经常使用到多线程,而多线程始终与锁存在紧密地联系,以下详细的介绍如何在C++程序开发过程中自定义锁的几种方法。
1. 下面给出一段代码展现如何通过Mutex实现锁的功能(window platform):
Header File
//
// Mutex.h
// namespace LockBase
{
clasee Mutex
{
public:
Mutex(HANDLE mutex);
~Mutex(void);
operator bool() const;
void Unlock(void); private:
HANDLE m_mutex;
boll b_unlocked; }; #define lock(hmutex) for(LockBase::Mutex m_lock(hmutex);!m_lock;m_lock.UnLock())
}
Cpp File
//
// Mutex.cpp
// #include"Mutex.h" using namespace LockBae; Mutex::Mutex(HANDLE mutex):b_unlocked()
{
m_mutex=mutex;
::WaitForSingleObject(m_mutex,INFINE);
} Mutex::~Mutex(void)
{
::ReleaseMutex(m_nutex);
}
void Mutex::Unlock(void)
{
b_unlocked=true;
} Mutex::operator bool() const
{
return b_unlocked;
}
Using Demo
//
// using lock demo
// HANDLE mutex=::CreateMutex(.false;);
lock(mutex)
{ }
2.通过CRITICAL_SECTION实现线程锁功能(window platform):
ScopedLock.h File
//
// ScopeLock.h
// #ifndef ScopedLock_INCLUDED
#define ScopedLock_INCLUDED namespace LockBase
{
template<class T>
class scopedLock
{
// A class that simplifies thread synchronization
// with a mutex.
// The constructor accepts a Mutex (and optionally
// a timeout value in milliseconds) and locks it.
// The destructor unlocks the mutex. public:
explicit ScopedLock(T& mutex): _mutex(mutex)
{
_mutex.lock();
} ~ScopedLock()
{
_mutex.unlock();
} private:
T& _mutex; ScopedLock();
ScopedLock(const ScopedLock&);
ScopedLock& operator = (const ScopedLock&);
}; template<class T>
class ScopedLockWithUnlock
{
// A class that simplifies thread synchronization
// with a mutex.
// The constructor accepts a Mutex (and optionally
// a timeout value in milliseconds) and locks it.
// The destructor unlocks the mutex.
// The unlock() member function allows for manual
// unlocking of the mutex. public:
explicit ScopedLockWithUnlock(T& mutex): _pMutex(&mutex)
{
_pMutex->lock();
} ~ScopedLockWithUnlock()
{
unlock();
} void unlock()
{
if (_pMutex)
{
_pMutex->unlock();
_pMutex = ;
}
} private:
T* _pMutex; ScopedLockWithUnlock();
ScopedLockWithUnlock(const ScopedLockWithUnlock&);
ScopedLockWithUnlock& operator = (const ScopedLockWithUnlock&);
};
} //namespace LockBase #endif //ScopedLock_INCLUDED
Mutex_WIN32.h File
//
// Mutex_WIN32.h
// #ifndef Mutex_WIN32_INCLUDED
#define Mutex_WIN32_INCLUDED namespace LockBase
{
class MutexImpl
{
protected:
MutexImpl();
~MutexImpl();
void lockImpl();
bool tryLockImpl();
void unlockImpl(); private:
CRITICAL_SECTION _cs;
}; typedef MutexImpl FastMutexImpl; //
// inlines
//
inline void MutexImpl::lockImpl()
{
try
{
EnterCriticalSection(&_cs);
}
catch (...)
{
throw std::runtime_error("cannot lock mutex");
} } inline bool MutexImpl::tryLockImpl()
{
try
{
return TryEnterCriticalSection(&_cs) != ;
}
catch (...)
{
throw std::runtime_error("cannot lock mutex");
}
} inline void MutexImpl::unlockImpl()
{
LeaveCriticalSection(&_cs);
} } //namespace LockBase #endif // Mutex_WIN32_INCLUDED
Mutex_WIN32.cpp File
//
// Mutex_WIN32.cpp
// namespace LockBase { MutexImpl::MutexImpl()
{
// the fct has a boolean return value under WInnNt/2000/XP but not on Win98
// the return only checks if the input address of &_cs was valid, so it is safe to omit it
InitializeCriticalSectionAndSpinCount(&_cs, );
} MutexImpl::~MutexImpl()
{
DeleteCriticalSection(&_cs);
}
} // namespace LockBase
Mutex.cpp File
//
// Mutex.cpp
// #ifdef _MSC_VER
#include "Mutex_WIN32.cpp"
#else
#include "Mutex_LINUX.cpp"
#endif using namespace LockBase; Mutex::Mutex()
{
} Mutex::~Mutex()
{
}
待续。。。
C++开发过程多线程同步lock的实现的更多相关文章
- c#中多线程同步Lock(锁)的研究以及跨线程UI的操作
本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象.由于想更直观的显示结果,所以,在做demo的时候,就把多线程通过事件操作UI的代码也写了出来,留作备忘和分享吧. 其实多线程的同步,使用 ...
- c#中多线程同步Lock(锁)的研究以及跨线程UI的操作 (转)
https://www.cnblogs.com/tommyheng/p/4104552.html 本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象.由于想更直观的显示结果,所以,在做de ...
- 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock
[源码下载] 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLoc ...
- 通过Lock对象以及Condition对象实现多线程同步
通过Lock对象以及Condition对象实现多线程同步: 在之前的学习中,无论是通过synchronized建立同步代码块,还是通过synchronized建立同步函数,都是把对象看成一把锁来实现同 ...
- 读写锁(read-write lock)机制-----多线程同步问题的解决
原文: http://blog.chinaunix.net/uid-27177626-id-3791049.html ----------------------------------------- ...
- c#初学-多线程中lock用法的经典实例
本文转载自:http://www.cnblogs.com/promise-7/articles/2354077.html 一.Lock定义 lock 关键字可以用来确保代码块完成运行,而不会被 ...
- C# 多线程同步和线程通信
多线程通信 1. 当线程之间有先后的依赖关系时,属于线程之间的通信问题.也就是后一个线程要等待别的一个或多个线程全部完成,才能开始下一步的工作.可以使用: WaitHandle Class WaitH ...
- Java多线程同步问题的探究
一.线程的先来后到——问题的提出:为什么要有多线程同步?Java多线程同步的机制是什么? http://www.blogjava.net/zhangwei217245/archive/2010/03/ ...
- Java多线程同步的方法
一 synchronized关键字 1.synchronized实现原理: ---基于对象监视器(锁) java中所有对象都自动含有单一的锁,JVM负责跟踪对象被加锁的次数.如果一个对象被解锁,其计数 ...
随机推荐
- NetworkComms V3 使用Json序列化器进行网络通信
刚才在网上闲逛,偶然看到一篇文章 C#(服务器)与Java(客户端)通过Socket传递对象 网址是:http://www.cnblogs.com/iyangyuan/archive/2012/12/ ...
- 【软件工具】Driver Booster3永久激活法
原作者網址:erik2041999 (YouTube) 1.安装Driver Booster3 (档案已附) 2.使用此启动码0187E-B9764-4D9FA-211B3断网启动 3.保持断网状态并 ...
- BestCoder Round #53 (div.1)
Problem A: 题目大意: 给出以节点1为根的一棵树A,判断它是否是特殊的.一棵树是特殊的当且仅当不存在和它不完全相同的一棵树B,使得A中点i到点1的距离和B中相等. 题解: 假设一个点x的深度 ...
- Bootstrap<基础四> 代码
Bootstrap 允许您以两种方式显示代码: 第一种是 <code> 标签.如果您想要内联显示代码,那么您应该使用 <code> 标签. 第二种是 <pre> 标 ...
- Promise学习
转自:http://www.cnblogs.com/lvdabao/p/es6-promise-1.html 去年6月份, ES2015正式发布(也就是ES6,ES6是它的乳名),其中Promise被 ...
- c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast
c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast [版权声明]转载请注明出处 http://www.cnblogs.c ...
- myeclipse激活法,可以试一试
我的myeclipse2014也是这样激活: 第一步:输入任意用户名 第二步:点击Systemid... 按钮,自动生成本机器的systemid. 第三步: 点菜单Tools->RebuildK ...
- centos7安装jdk8
1.查看是否已经安装了jdk rpm -qa|grep java 表示没有安装jre 如果已经安装请先卸载 2.查看可安装的java环境 yum list java* 3.安装 java-1.8.0- ...
- win7配上的网关会自动消失?解决
前几天遇见一台计算机,发现手动设置的ip和网关等...在使用了一会就变成,网关丢失,其他不变...奇怪啊...第一次遇见.后来找了一下.有答案了. 先将客户端卸载掉,再打开网络和共享中心-->本 ...
- AFNetworking之缓存篇
苦苦看了我两天,最近后台为了减轻压力,要我做缓存,我说好吧...... 借鉴了别人的说法找到一张图可以看明白好多: 这个是我比较战成一种方案. 好了直接上代码了 首先我们要有自己缓存的类 ...