在程序开发过程经常使用到多线程,而多线程始终与锁存在紧密地联系,以下详细的介绍如何在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的实现的更多相关文章

  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. 手机升级到iOS10,用Xcode7.3进行真机调试方法

    今天发布的正式版的iOS10,手机果断升级了,结果发现Xcode7.3不能真机调试了,原因是Xcode7.3里面没有iOS10的sdk,下面这个压缩包你可以下载下来放在你的Xcode7.3里面,当然了 ...

  2. twrp编译步骤 (CWM也差不多)

    1.源码的跟目录执行:. build/envsetup.sh,构建编译环境 2.执行 make -j4 otatools,生成后面编译需要的工具 3.把boot或recovery放到home目录,执行 ...

  3. z-index 可以使用负值,CSS相对定位、绝对定位利器

    很多技巧都是在工作中测试出来的,我搞DIV+CSS前端开发,现在是安卓收藏家,日常也有很多技巧,刚刚突然发现的这个技巧,真的很实用:Z-index值可以使用负值. z-index是个很强大的属性,是个 ...

  4. php 字符串转数组

    $str = "你好吗"; function str($str) {     $length = mb_strlen($str);     for ($i=0; $i<$le ...

  5. Hadoop示例程序WordCount详解及实例(转)

    1.图解MapReduce 2.简历过程: Input: Hello World Bye World Hello Hadoop Bye Hadoop Bye Hadoop Hello Hadoop M ...

  6. tomcat8的配置

    本文章只适合初入javaweb的新人. 点击tomcat8的bin目录下的startup.bat,启动tomcat.在浏览器中输入http://localhost:8080  打开项目管理页,点击Ma ...

  7. php 实现冒泡算法排序、快速排序、选择排序,插入排序

    许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西 .但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要 ...

  8. Android测试关注点

    Android系统app测试,一般有native app原生,web app网页, hybird app混合 1.功能测试,考虑业务逻辑,主要手机和APP交互功能,来电,短信,闹钟可能对app造成的影 ...

  9. 排序系列 之 折半插入排序算法 —— Java实现

    基本思想: 折半插入算法是对直接插入排序算法的改进,排序原理同直接插入算法: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中 ...

  10. net iis 部署中出现的问题及解决方案

    1.HTTP500.21 错误 解决方法:重新注册asp.net C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe –i ...