在程序开发过程经常使用到多线程,而多线程始终与锁存在紧密地联系,以下详细的介绍如何在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. Android获取屏幕实际高度跟显示高度,判断Android设备是否拥有虚拟功能键

    //获取屏幕尺寸,不包括虚拟功能高度 getWindowManager().getDefaultDisplay().getHeight(); 获取屏幕原始尺寸高度,包括虚拟功能键高度, private ...

  2. 如何在CentOS 7中禁止IPv6

    最近,我的一位朋友问我该如何禁止IPv6.在搜索了一番之后,我找到了下面的方案.下面就是在我的CentOS 7 迷你服务器禁止IPv6的方法. 你可以用两个方法做到这个. 方法 1 编辑文件/etc/ ...

  3. linux下关于Apache设置二级域名绑定二级目录的方法

    背景:对于一些论坛网站,某些目录需要制定二级域名去访问,这时候就要在apache中用二级域名绑定二级目录. 方法: 1.首先你要找到apache安装路径,在apahce安装路径下的conf文件夹中找到 ...

  4. Bitmap 的几种压缩方式

    微信的缩略图要求是不大于32k,这就需要对我的图片进行压缩.试了几种方法,一一道来. 代码如下 ByteArrayOutputStream baos =  new  ByteArrayOutputSt ...

  5. js中Array的一些扩展

    IE下很多Array的方法都不被支持.每次都要写.所以记下来,以免忘记: 以下是对Array的一些扩展,在FF ,google 下是不需要加的. /** * 方法Array.filter(functi ...

  6. 关于java 定时器的使用总结

    直接上代码,代码中有注释(代码中还有一些本人的其他测试,读者可以忽略不计).读者在代码中发现了bug,欢迎指正. package j2se.system.test; import java.text. ...

  7. AngularJS的学习笔记(二)

    只给自己看的. AngularJS 表达式 angularjs 使用表达式将数据绑定到html中. AngularJS 表达式写在双大括号内:{{ expression }}. AngularJS 表 ...

  8. Android 取源码时 error: could not verify the tag 'v1.12.4'的解决

    原帖地址http://forum.xda-developers.com/showthread.php?p=46100064也没说啥原因 repo init -u git://github.com/Cy ...

  9. Thinkphp 带查询条件数据分页

    //查询条件中如果有中文 $keyword= urldecode(I("request.keyword")); if ($keyword!=""){ $Mode ...

  10. JDBC代码示例

    package test; import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;imp ...