在程序开发过程经常使用到多线程,而多线程始终与锁存在紧密地联系,以下详细的介绍如何在C++程序开发过程中自定义锁的几种方法。

1. 下面给出一段代码展现如何通过Mutex实现锁的功能(window platform):

Header File

  1. //
  2. // Mutex.h
  3. //
  4.  
  5. namespace LockBase
  6. {
  7. clasee Mutex
  8. {
  9. public:
  10. Mutex(HANDLE mutex);
  11. ~Mutex(void);
  12. operator bool() const;
  13. void Unlock(void);
  14.  
  15. private:
  16. HANDLE m_mutex;
  17. boll b_unlocked;
  18.  
  19. };
  20.  
  21. #define lock(hmutex) for(LockBase::Mutex m_lock(hmutex);!m_lock;m_lock.UnLock())
  22. }

Cpp File

  1. //
  2. // Mutex.cpp
  3. //
  4.  
  5. #include"Mutex.h"
  6.  
  7. using namespace LockBae;
  8.  
  9. Mutex::Mutex(HANDLE mutex):b_unlocked()
  10. {
  11. m_mutex=mutex;
  12. ::WaitForSingleObject(m_mutex,INFINE);
  13. }
  14.  
  15. Mutex::~Mutex(void)
  16. {
  17. ::ReleaseMutex(m_nutex);
  18. }
  19. void Mutex::Unlock(void)
  20. {
  21. b_unlocked=true;
  22. }
  23.  
  24. Mutex::operator bool() const
  25. {
  26. return b_unlocked;
  27. }

Using Demo

  1. //
  2. // using lock demo
  3. //
  4.  
  5. HANDLE mutex=::CreateMutex(.false;);
  6. lock(mutex)
  7. {
  8.  
  9. }

2.通过CRITICAL_SECTION实现线程锁功能(window platform):

ScopedLock.h File

  1. //
  2. // ScopeLock.h
  3. //
  4.  
  5. #ifndef ScopedLock_INCLUDED
  6. #define ScopedLock_INCLUDED
  7.  
  8. namespace LockBase
  9. {
  10. template<class T>
  11. class scopedLock
  12. {
  13. // A class that simplifies thread synchronization
  14. // with a mutex.
  15. // The constructor accepts a Mutex (and optionally
  16. // a timeout value in milliseconds) and locks it.
  17. // The destructor unlocks the mutex.
  18.  
  19. public:
  20. explicit ScopedLock(T& mutex): _mutex(mutex)
  21. {
  22. _mutex.lock();
  23. }
  24.  
  25. ~ScopedLock()
  26. {
  27. _mutex.unlock();
  28. }
  29.  
  30. private:
  31. T& _mutex;
  32.  
  33. ScopedLock();
  34. ScopedLock(const ScopedLock&);
  35. ScopedLock& operator = (const ScopedLock&);
  36. };
  37.  
  38. template<class T>
  39. class ScopedLockWithUnlock
  40. {
  41. // A class that simplifies thread synchronization
  42. // with a mutex.
  43. // The constructor accepts a Mutex (and optionally
  44. // a timeout value in milliseconds) and locks it.
  45. // The destructor unlocks the mutex.
  46. // The unlock() member function allows for manual
  47. // unlocking of the mutex.
  48.  
  49. public:
  50. explicit ScopedLockWithUnlock(T& mutex): _pMutex(&mutex)
  51. {
  52. _pMutex->lock();
  53. }
  54.  
  55. ~ScopedLockWithUnlock()
  56. {
  57. unlock();
  58. }
  59.  
  60. void unlock()
  61. {
  62. if (_pMutex)
  63. {
  64. _pMutex->unlock();
  65. _pMutex = ;
  66. }
  67. }
  68.  
  69. private:
  70. T* _pMutex;
  71.  
  72. ScopedLockWithUnlock();
  73. ScopedLockWithUnlock(const ScopedLockWithUnlock&);
  74. ScopedLockWithUnlock& operator = (const ScopedLockWithUnlock&);
  75. };
  76. } //namespace LockBase
  77.  
  78. #endif //ScopedLock_INCLUDED

Mutex_WIN32.h File

  1. //
  2. // Mutex_WIN32.h
  3. //
  4.  
  5. #ifndef Mutex_WIN32_INCLUDED
  6. #define Mutex_WIN32_INCLUDED
  7.  
  8. namespace LockBase
  9. {
  10. class MutexImpl
  11. {
  12. protected:
  13. MutexImpl();
  14. ~MutexImpl();
  15. void lockImpl();
  16. bool tryLockImpl();
  17. void unlockImpl();
  18.  
  19. private:
  20. CRITICAL_SECTION _cs;
  21. };
  22.  
  23. typedef MutexImpl FastMutexImpl;
  24.  
  25. //
  26. // inlines
  27. //
  28. inline void MutexImpl::lockImpl()
  29. {
  30. try
  31. {
  32. EnterCriticalSection(&_cs);
  33. }
  34. catch (...)
  35. {
  36. throw std::runtime_error("cannot lock mutex");
  37. }
  38.  
  39. }
  40.  
  41. inline bool MutexImpl::tryLockImpl()
  42. {
  43. try
  44. {
  45. return TryEnterCriticalSection(&_cs) != ;
  46. }
  47. catch (...)
  48. {
  49. throw std::runtime_error("cannot lock mutex");
  50. }
  51. }
  52.  
  53. inline void MutexImpl::unlockImpl()
  54. {
  55. LeaveCriticalSection(&_cs);
  56. }
  57.  
  58. } //namespace LockBase
  59.  
  60. #endif // Mutex_WIN32_INCLUDED

Mutex_WIN32.cpp File

  1. //
  2. // Mutex_WIN32.cpp
  3. //
  4.  
  5. namespace LockBase {
  6.  
  7. MutexImpl::MutexImpl()
  8. {
  9. // the fct has a boolean return value under WInnNt/2000/XP but not on Win98
  10. // the return only checks if the input address of &_cs was valid, so it is safe to omit it
  11. InitializeCriticalSectionAndSpinCount(&_cs, );
  12. }
  13.  
  14. MutexImpl::~MutexImpl()
  15. {
  16. DeleteCriticalSection(&_cs);
  17. }
  18. } // namespace LockBase

Mutex.cpp File

  1. //
  2. // Mutex.cpp
  3. //
  4.  
  5. #ifdef _MSC_VER
  6. #include "Mutex_WIN32.cpp"
  7. #else
  8. #include "Mutex_LINUX.cpp"
  9. #endif
  10.  
  11. using namespace LockBase;
  12.  
  13. Mutex::Mutex()
  14. {
  15. }
  16.  
  17. Mutex::~Mutex()
  18. {
  19. }

待续。。。

C++开发过程多线程同步lock的实现的更多相关文章

  1. c#中多线程同步Lock(锁)的研究以及跨线程UI的操作

    本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象.由于想更直观的显示结果,所以,在做demo的时候,就把多线程通过事件操作UI的代码也写了出来,留作备忘和分享吧. 其实多线程的同步,使用 ...

  2. c#中多线程同步Lock(锁)的研究以及跨线程UI的操作 (转)

    https://www.cnblogs.com/tommyheng/p/4104552.html 本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象.由于想更直观的显示结果,所以,在做de ...

  3. 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock

    [源码下载] 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLoc ...

  4. 通过Lock对象以及Condition对象实现多线程同步

    通过Lock对象以及Condition对象实现多线程同步: 在之前的学习中,无论是通过synchronized建立同步代码块,还是通过synchronized建立同步函数,都是把对象看成一把锁来实现同 ...

  5. 读写锁(read-write lock)机制-----多线程同步问题的解决

    原文: http://blog.chinaunix.net/uid-27177626-id-3791049.html ----------------------------------------- ...

  6. c#初学-多线程中lock用法的经典实例

    本文转载自:http://www.cnblogs.com/promise-7/articles/2354077.html 一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被 ...

  7. C# 多线程同步和线程通信

    多线程通信 1. 当线程之间有先后的依赖关系时,属于线程之间的通信问题.也就是后一个线程要等待别的一个或多个线程全部完成,才能开始下一步的工作.可以使用: WaitHandle Class WaitH ...

  8. Java多线程同步问题的探究

    一.线程的先来后到——问题的提出:为什么要有多线程同步?Java多线程同步的机制是什么? http://www.blogjava.net/zhangwei217245/archive/2010/03/ ...

  9. Java多线程同步的方法

    一 synchronized关键字 1.synchronized实现原理: ---基于对象监视器(锁) java中所有对象都自动含有单一的锁,JVM负责跟踪对象被加锁的次数.如果一个对象被解锁,其计数 ...

随机推荐

  1. IO 相关配置参数

    INNODB I/O相关配置 记录日志为顺序I/O,刷新日志到数据文件为随机操作.顺序操作性能快于随机IO. innodb_log_file_size innodb_log_files_in_grou ...

  2. 微信支付之扫码支付开发:我遇到的坑及解决办法(附:Ecshop 微信支付插件)

    前段时间帮一个朋友的基于ecshop开发的商城加入微信扫描支付功能,本以为是很简单的事儿——下载官方sdk或开发帮助文档,按着里面的做就ok了,谁知折腾了两三天的时间才算搞定,中间也带着疑问在网上找了 ...

  3. 罗永浩Vs王自如:浮躁的世界该如何降温?!

    这段时间智能手机业界有一件事情炒得纷纷扬扬,可谓是波澜起伏,想必大家都多少略有耳闻.昨天中午在群里看到“罗永浩舌战王自如视频”分享,就有些‘凑热闹’的好奇点开看看.一开场的几分钟正如老罗所说的那样:两 ...

  4. fuelphp 问题1

    fuelphp遇到的一些小问题,写下来以防止别人遇到相同的问题,写的比较随意 1.引用到orm\model 报错:class Model_Test extends Orm\Model 报错内容:Cla ...

  5. Spring框架学习路线和概述

    Spring的Ioc Spring的AOP , AspectJ Spring的事务管理 , 三大框架的整合. Spring框架的概述: 1. 什么是Spring Spring是分层的JavaSE/EE ...

  6. MindManager使用说明

    MindManager是一款很好实现思维导图的软件,唯一有些遗憾的是它并不是免费的,而且价格还不菲. 初识MindManager 正确安装好MindManager之后,打开软件,会发现MindMana ...

  7. unity代码加密for Android,mono编译

    uinty3d加密推荐几篇比较好的博客链接: http://www.cppcourse.com/u3d-encryption.html http://www.xuanyusong.com/archiv ...

  8. c语言函数指针

    #include <stdio.h> typedef void (*intFunc)(int i); void test1(int age) { printf("test1:%d ...

  9. AndroidStudio快捷键

    在这里,自己整理了下在使用AndroidStudio开发工具所使用到的一些快捷键提示,也出于在开发过程中节省时间提升效率,然而可能多数开发者之前使用的都是Eclipse开发工具,可能开始都不习惯,但是 ...

  10. 【转】RadControls for Silverlight(学习1-GridView)

    引用:Telerik(官 网:http://www.telerik.com/)是保加利亚的一个软件公司,专注于微软.Net平台的表示层与内容管理控件.我们提供高度稳定性和丰富性能的组件产品,并可应用在 ...