不知道大家对多线程或多进程间的同步互斥的控制机制了解的怎么样,其实有很多种方法可以实现这个目的,但是这些方法其实由4种最基本的方法实现。这4种最基本的方法具体定义如下:在这有讲得不对的地方欢迎各位扔砖,希望不会误导大家。
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。
2、互斥量:为协调共同对一个共享资源的单独访问而设计的。
3、信号量:为控制一个具有有限数量用户资源而设计。
4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。
EnterCriticalSection()语句执行后代码将进入临界区以后无论发生什么,必须确保与之匹配的LeaveCriticalSection()都能够被执行到。否则临界区保护的共享资源将永远不会被释放。虽然临界区同步速度很快,但却只能用来同步本进程内的线程,而不可用来同步多个进程中的线程。
互斥量跟临界区很相似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出,以便其他线程在获得后得以访问资源。互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。
互斥量包含的几个操作原语:
CreateMutex() 创建一个互斥量
OpenMutex() 打开一个互斥量
ReleaseMutex() 释放互斥量
WaitForMultipleObjects() 等待互斥量对象
应网友要求,在此贴互斥--Mutex的简略版希望对你们有用,这个简略版的Mutex可以跨多个平台,比如:win32、linux、android等等类unix的系统。谢谢!
#ifndef HEART_MOBIHEART_MMUTEX_H
#define HEART_MOBIHEART_MMUTEX_H
#ifdef WIN32
# include <windows.h>
#else
# include <pthread.h>
#endif
#ifdef WIN32
typedef CRITICAL_SECTION MOBI_MUTEX_SECTION;
# define MOBI_MUTEX_INIT ::InitializeCriticalSection
# define MOBI_MUTEX_DESTROY ::DeleteCriticalSection
# define MOBI_MUTEX_LOCK ::EnterCriticalSection
# define MOBI_MUTEX_UNLOCK ::LeaveCriticalSection
#else
typedef pthread_mutex_t MOBI_MUTEX_SECTION;
# define MOBI_MUTEX_INIT pthread_mutex_init
# define MOBI_MUTEX_DESTROY pthread_mutex_destroy
# define MOBI_MUTEX_LOCK pthread_mutex_lock
# define MOBI_MUTEX_UNLOCK pthread_mutex_unlock
#endif
class Mutex
{
public:
Mutex()
{
MOBI_MUTEX_INIT(&m_mutex
#ifndef _WIN32
, NULL
#endif
);
}
virtual ~Mutex() {MOBI_MUTEX_DESTROY(&m_mutex);}
virtual void Lock() const {MOBI_MUTEX_LOCK(&m_mutex);}
virtual void Unlock() const { MOBI_MUTEX_UNLOCK(&m_mutex); }
private:
mutable MOBI_MUTEX_SECTION m_mutex;
};
class AutoLock
{
public:
AutoLock(const Mutex& mutex, bool autolocked = true) : m_mutex(&mutex), m_locked(true)
{
if(autolocked)
{
m_mutex->Lock();
m_locked = autolocked;
}
};
~AutoLock()
{
if(m_locked)
{
m_mutex->Unlock();
}
};
private:
const Mutex* m_mutex;
bool m_locked;
};
#ifndef LOCK
# define LOCK(mutex) AutoLock locker(mutex)
#endif
#endif//HEART_MOBIHEART_MMUTEX_H原文:http://blog.csdn.net/wenrenhua08/article/details/39924907