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负责跟踪对象被加锁的次数.如果一个对象被解锁,其计数 ...
随机推荐
- blade and soul factions
Faction You will be asked to join one of the elite Factions as a rising Martial Artist no matter wha ...
- 删除 https://tfs.visualstudio.com上的项目
比如注册的tfs地址为https://zhaobl.visualstudio.com,要删除的项目是 bushub 那么需要使用VS2013以上的 C:\Program Files (x86)\Mic ...
- Linq to xml 小例
static void Main(string[] args) { string strXml = @"<?xml version='1.0' en ...
- TFS Workspace 更改电脑名称
不小心改了计算机名称 导致VS在保存项目的时候,包如下错误: 解决方法: 第一步: 第二步:输入如下片段 tf workspaces /updateComputerName:旧计算机名称 /coll ...
- android异常: java.net.ConnectException: localhost/127.0.0.1:8080 - Connection refused
android手机做下载文件时,报了如下异常: java.net.ConnectException: localhost/127.0.0.1:8080 - Connection refused 模拟器 ...
- 将Jquery序列化后的表单值转换成Json
From: https://segmentfault.com/a/1190000000473625 小朋友有一个表单,他想以Json的方式获取到表单的内容.小朋友尝试了以下方式. 通过$(" ...
- JUnit 4 单元测试
Individual Project ——JUnit 4 单元测试 学习到JUnit单元测试,我拿来测试之前写过的一个计算器(两个依存类:Calc.java CalcFunction.java).代码 ...
- CPU与内存的那些事
下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如下: 转: CPU的等待有多久? 原文标题:What Your Computer Does While You Wait 原文地址: ...
- [Python Day5] 常用模块
目录: 1.模块介绍 2.time & datetime 3.random 4.OS 5.sys 6.shutil 7.json & pickle 8.shelve 9.xml 处理 ...
- MYSQL5.7无法启动服务原因及解决方案
mysql5.7安装完成后,想要把它发布成windows服务: 首先,应该配置新的配置文件,然后将cmd打开到安装目录的bin文件,键入: mysqld --default-file="D: ...