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负责跟踪对象被加锁的次数.如果一个对象被解锁,其计数 ...
随机推荐
- IO 相关配置参数
INNODB I/O相关配置 记录日志为顺序I/O,刷新日志到数据文件为随机操作.顺序操作性能快于随机IO. innodb_log_file_size innodb_log_files_in_grou ...
- 微信支付之扫码支付开发:我遇到的坑及解决办法(附:Ecshop 微信支付插件)
前段时间帮一个朋友的基于ecshop开发的商城加入微信扫描支付功能,本以为是很简单的事儿——下载官方sdk或开发帮助文档,按着里面的做就ok了,谁知折腾了两三天的时间才算搞定,中间也带着疑问在网上找了 ...
- 罗永浩Vs王自如:浮躁的世界该如何降温?!
这段时间智能手机业界有一件事情炒得纷纷扬扬,可谓是波澜起伏,想必大家都多少略有耳闻.昨天中午在群里看到“罗永浩舌战王自如视频”分享,就有些‘凑热闹’的好奇点开看看.一开场的几分钟正如老罗所说的那样:两 ...
- fuelphp 问题1
fuelphp遇到的一些小问题,写下来以防止别人遇到相同的问题,写的比较随意 1.引用到orm\model 报错:class Model_Test extends Orm\Model 报错内容:Cla ...
- Spring框架学习路线和概述
Spring的Ioc Spring的AOP , AspectJ Spring的事务管理 , 三大框架的整合. Spring框架的概述: 1. 什么是Spring Spring是分层的JavaSE/EE ...
- MindManager使用说明
MindManager是一款很好实现思维导图的软件,唯一有些遗憾的是它并不是免费的,而且价格还不菲. 初识MindManager 正确安装好MindManager之后,打开软件,会发现MindMana ...
- unity代码加密for Android,mono编译
uinty3d加密推荐几篇比较好的博客链接: http://www.cppcourse.com/u3d-encryption.html http://www.xuanyusong.com/archiv ...
- c语言函数指针
#include <stdio.h> typedef void (*intFunc)(int i); void test1(int age) { printf("test1:%d ...
- AndroidStudio快捷键
在这里,自己整理了下在使用AndroidStudio开发工具所使用到的一些快捷键提示,也出于在开发过程中节省时间提升效率,然而可能多数开发者之前使用的都是Eclipse开发工具,可能开始都不习惯,但是 ...
- 【转】RadControls for Silverlight(学习1-GridView)
引用:Telerik(官 网:http://www.telerik.com/)是保加利亚的一个软件公司,专注于微软.Net平台的表示层与内容管理控件.我们提供高度稳定性和丰富性能的组件产品,并可应用在 ...