多线程之线程同步Mutex (功能与Critial Sections同样,可是属于内核对象,訪问速度较慢。能够被不同进程调用)



一 Mutex

    相互排斥对象(mutex)内核对象可以确保线程拥有对单个资源的相互排斥訪问权。实际上相互排斥对象是因此而得名的。相互排斥对象包括一个使用数量,一个线程ID和一个递归计数器。

相互排斥对象的行为特性与关键代码段同样。可是相互排斥对象属于内核对象,而关键代码段则属于用户方式对象。这意味着相互排斥对象的执行速度比关键代码段要慢。可是这也意味着不同进程中的多个线程可以訪问单个相互排斥对象。而且这意味着线程在等待訪问资源时可以设定一个超时值。

ID用于标识系统中的哪个线程当前拥有相互排斥对象,递归计数器用于指明该线程拥有相互排斥对象的次数。

相互排斥对象有很多用途,属于最经常使用的内核对象之中的一个。通常来说,它们用于保护由多个线程訪问的内存块。假设多个线程要同一时候訪问内存块。内存块中的数据就可能遭到破坏。相互排斥对象可以保证訪问内存块的不论什么线程拥有对该内存块的独占訪问权。这样就行保证数据的完整性。

/*****************************************************************************
* OpenST Basic tool library *
* Copyright (C) 2014 Henry.Wen renhuabest@sina.com . *
* *
* This file is part of OST. *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License version 3 as *
* published by the Free Software Foundation. *
* *
* You should have received a copy of the GNU General Public License *
* along with OST. If not, see <http://www.gnu.org/licenses/>. *
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an "AS IS" BASIS, *
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
* Author : Henry.Wen *
* E-Mail : renhuabest@sina.com *
* License : GNU General Public License (GPL) *
* source code availability:https://github.com/henrywen2011/OST *
* *
*----------------------------------------------------------------------------*
* Remark : Description *
*----------------------------------------------------------------------------*
* Change History : *
* Date | Version | Author | Description *
*----------------------------------------------------------------------------*
* 2014/01/26 | 1.0.0.1 | Henry.Wen | Create file *
*----------------------------------------------------------------------------*
* *
*****************************************************************************/
#ifndef OST_CORE_OSTMUTEX_H
#define OST_CORE_OSTMUTEX_H #include "OSTTypes.h"
#include "OSTPlatform.h"
#include "OSTBasicable.h" #if (OST_PLAFORM == OST_PLATFORM_WIN32)
typedef CRITICAL_SECTION OST_MUTEX_SECTION;
#else
#include <pthread>
typedef pthread_mutex_t OST_MUTEX_SECTION;
#endif OST_NAMESPACE_BEGIN
/**
* @class OSTMutex
* @brief A Mutex (mutual exclusion) is a synchronization mechanism used to control
* access to a shared resourcein a concurrent (multithreaded) scenario.
*/
class OSTMutex : public NonCopyable
{
public:
OSTMutex(void);
~OSTMutex(void); /**
* @brief Locks the OSTMutex. Blocks if the OSTMutex is held by another thread.
*/
void Lock() const; /**
* @brief Unlocks the mutex so that it can be acquired by other threads.
*/
void Unlock() const; /**
* @brief Tries to lock the mutex.
* @return
* -<em>OST_FALSE</em> if the mutex is already held by another thread
* -<em>OST_TRUE</em> otherwise.
*/
OSTBool TryLock(); /**
* @brief Locks the mutex. Blocks up to the given number of milliseconds
* if the mutex is held by another thread.
* Performance Note: On most platforms (including Windows), this member function is
* implemented using a loop calling (the equivalent of) tryLock() and Thread::sleep().
* On POSIX platforms that support pthread_mutex_timedlock(), this is used.
*
* @return
* - <em>OST_TRUE</em> if the mutex was successfully locked.
* - <em>OST_FALSE</em> otherwise.
*/
OSTBool TryLock(long millisecondes); private:
mutable OST_MUTEX_SECTION m_mutex;
}; /**
* @class AutoLock
* @brief Using the AutoLock class is the preferred way to automatically
* lock and unlock a mutex.
*/
class AutoLock
{
public:
AutoLock(const OSTMutex& mutex, OSTBool autolocked = OST_TRUE) : m_mutex(mutex), m_locked(autolocked)
{
if(autolocked)
{
m_mutex.Lock();
m_locked = autolocked;
}
}; ~AutoLock()
{
if(m_locked)
{
m_mutex.Unlock();
}
}; private:
AutoLock(const AutoLock&);
AutoLock& operator = (const AutoLock&); private:
const OSTMutex& m_mutex;
OSTBool m_locked;
}; /**
* @class AutoUnLock
* @brief Using the AutoUnLock class is the preferred way to automatically
* lock and unlock a mutex.
*/
class AutoUnLock
{
public:
AutoUnLock(const OSTMutex& mutex, OSTBool unlocked = OST_TRUE) : m_mutex(mutex), m_unlocked(unlocked)
{
if(m_unlocked)
{
m_mutex.Unlock();
}
} ~AutoUnLock()
{
m_mutex.Lock();
} private:
AutoUnLock(const AutoUnLock&);
AutoUnLock& operator = (const AutoUnLock&); private:
const OSTMutex& m_mutex;
OSTBool m_unlocked;
}; #define LOCK(mutex) AutoLock locker(mutex)
#define UNLOCK(mutex) AutoUnLock locker(mutex) OST_NAMESPACE_END #endif//OST_CORE_OSTMUTEX_H

OSTMutex_POSIX.cpp

/*****************************************************************************
* OpenST Basic tool library *
* Copyright (C) 2014 Henry.Wen renhuabest@sina.com . *
* *
* This file is part of OST. *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License version 3 as *
* published by the Free Software Foundation. *
* *
* You should have received a copy of the GNU General Public License *
* along with OST. If not, see <http://www.gnu.org/licenses/>. *
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an "AS IS" BASIS, *
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
* Author : Henry.Wen *
* E-Mail : renhuabest@sina.com *
* License : GNU General Public License (GPL) *
* source code availability:https://github.com/henrywen2011/OST *
* *
*----------------------------------------------------------------------------*
* Remark : Description *
*----------------------------------------------------------------------------*
* Change History : *
* Date | Version | Author | Description *
*----------------------------------------------------------------------------*
* 2014/01/24 | 1.0.0.1 | Henry.Wen | Create file *
*----------------------------------------------------------------------------*
* *
*****************************************************************************/
#include "OSTBaseExc.h"
#include "OSTMutex.h" OST_NAMESPACE_BEGIN OSTMutex::OSTMutex(void)
{
pthread_mutexattr_t attr; if( 0 != pthread_mutexattr_init(&attr) || 0 != pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE))
return; if (0 != pthread_mutex_init(&m_mutex, &attr))
{
pthread_mutexattr_destroy(&attr);
throw SystemExc("cannot create mutex");
}
pthread_mutexattr_destroy(&attr);
} OSTMutex::~OSTMutex(void)
{
pthread_mutex_destroy(&m_mutex);
} void OSTMutex::Lock() const
{
try
{
pthread_mutex_lock(&m_mutex);
}
catch (...)
{
throw SystemExc("Cannot lock mutex");
}
} void OSTMutex::Unlock() const
{
pthread_mutex_unlock(&m_mutex);
} OSTBool OSTMutex::TryLock()
{
OSTInt32 rc = pthread_mutex_trylock(&m_mutex);
if (0 == rc)
{
return OST_TRUE;
}
else if (rc == EBUSY)
{
return OST_FALSE;
}
else
{
throw SystemExc("Cannot lock mutex");
}
} OSTBool OSTMutex::TryLock(long millisecondes)
{
return OST_TRUE;
} OST_NAMESPACE_END

OSTMutex_Win32.cpp

/*****************************************************************************
* OpenST Basic tool library *
* Copyright (C) 2014 Henry.Wen renhuabest@sina.com . *
* *
* This file is part of OST. *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License version 3 as *
* published by the Free Software Foundation. *
* *
* You should have received a copy of the GNU General Public License *
* along with OST. If not, see <http://www.gnu.org/licenses/>. *
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an "AS IS" BASIS, *
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
* Author : Henry.Wen *
* E-Mail : renhuabest@sina.com *
* License : GNU General Public License (GPL) *
* source code availability:https://github.com/henrywen2011/OST *
* *
*----------------------------------------------------------------------------*
* Remark : Description *
*----------------------------------------------------------------------------*
* Change History : *
* Date | Version | Author | Description *
*----------------------------------------------------------------------------*
* 2014/01/24 | 1.0.0.1 | Henry.Wen | Create file *
*----------------------------------------------------------------------------*
* *
*****************************************************************************/
#include "OSTBaseExc.h"
#include "OSTMutex.h" OST_NAMESPACE_BEGIN OSTMutex::OSTMutex(void)
{
InitializeCriticalSectionAndSpinCount(&m_mutex, 4000);
} OSTMutex::~OSTMutex(void)
{
DeleteCriticalSection(&m_mutex);
} void OSTMutex::Lock() const
{
try
{
EnterCriticalSection(&m_mutex);
}
catch (...)
{
throw SystemExc("Cannot lock mutex");
}
} void OSTMutex::Unlock() const
{
LeaveCriticalSection(&m_mutex);
} OSTBool OSTMutex::TryLock()
{
try
{
return (TryEnterCriticalSection(&m_mutex) != 0 ? OST_TRUE : OST_FALSE);
}
catch(...)
{
}
throw SystemExc("Cannot lock mutex");
} OSTBool OSTMutex::TryLock(long millisecondes)
{
return OST_TRUE;
} OST_NAMESPACE_END

多线程相互排斥--mutex的更多相关文章

  1. 多线程相互排斥--mutex(二)

    不知道大家对多线程或多进程间的同步相互排斥的控制机制了解的怎么样,事实上有非常多种方法能够实现这个目的,可是这些方法事实上由4种最主要的方法实现.这4种最主要的方法详细定义例如以下:在这有讲得不正确的 ...

  2. android NDK编程:使用posix多线程与mutex相互排斥同步

    MainActivity.java 调用原生方法 posixThreads(int threads, int iterations) 启动线程 package com.apress.threads; ...

  3. 【C/C++多线程编程之六】pthread相互排斥量

    多线程编程之线程同步相互排斥量       Pthread是 POSIX threads 的简称,是POSIX的线程标准.          Pthread线程同步指多个线程协调地,有序地同步使用共享 ...

  4. 数据共享之相互排斥量mutex

    相互排斥量介绍 相互排斥量能够保护某些代码仅仅能有一个线程运行这些代码.假设有个线程使用相互排斥量运行某些代码,其它线程訪问是会被堵塞.直到这个线程运行完这些代码,其它线程才干够运行. 一个线程在訪问 ...

  5. Linux程序设计学习笔记----多线程编程线程同步机制之相互排斥量(锁)与读写锁

    相互排斥锁通信机制 基本原理 相互排斥锁以排他方式防止共享数据被并发訪问,相互排斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个相互排斥锁逻辑上绑定之后,对该资源的訪问操作例如以下: ...

  6. Linux多线程同步之相互排斥量和条件变量

    1. 什么是相互排斥量 相互排斥量从本质上说是一把锁,在訪问共享资源前对相互排斥量进行加锁,在訪问完毕后释放相互排斥量上的锁. 对相互排斥量进行加锁以后,不论什么其它试图再次对相互排斥量加锁的线程将会 ...

  7. linux系统编程:线程同步-相互排斥量(mutex)

    线程同步-相互排斥量(mutex) 线程同步 多个线程同一时候訪问共享数据时可能会冲突,于是须要实现线程同步. 一个线程冲突的演示样例 #include <stdio.h> #includ ...

  8. Android多线程研究(3)——线程同步和相互排斥及死锁

    为什么会有线程同步的概念呢?为什么要同步?什么是线程同步?先看一段代码: package com.maso.test; public class ThreadTest2 implements Runn ...

  9. Linux互斥和同步应用程序(一):posix线程和线程之间的相互排斥

    [版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流.请勿用于商业用途] 有了进程的概念,为何还要使用线程呢? 首先,回 ...

随机推荐

  1. 最全mysql的复制和读写分离

    mysql的复制和mysql的读写分离从来就不是一个简单的话题,今天笔者就详细来记录一下我学习的mysql.   mysql日至类型有:二进制日志,事务日志,错误日志,一般查询日志,中继日志,慢查询日 ...

  2. Python学习笔记(7)字典

    2019-03-07 字典(dict): (1)字典用大括号({})定义,字典由多个键及其对应的值组合而成,每一对键值组合称为项. (2)字典的键唯一,但是值可以是任何(不可变的)数据类型(整型,字符 ...

  3. php 魔术方法和魔术常量

    魔术方法:PHP把类中所有以__(两个下划线)开头的方法当成魔术方法,一般建议用户不要将自定义的方法前面加上__作为前缀.魔术方法: 1. __construct() 类的默认构造方法,如果__con ...

  4. Winserver服务器-AD字段对照简图

    AD字段对照简图

  5. ASP.NET-ActionFilter过滤器用法实例

    ActionFilter可以对每一个传过来的action请求进行过滤,非常有用,但是如果在这里判断过多,那么网站的性能和速度会不会变慢,这个问题值得思考,现在先放在这里. public class A ...

  6. angular-HTTP

    AngularJS $http 是一个用于读取web服务器上数据的服务. $http.get(url) 是用于读取服务器数据的函数. <div ng-app="myApp" ...

  7. WinCE C#程序,控制启动时仅仅能启动一个程序,使用相互排斥量来实现,该实现方法測试通过

    </pre><pre code_snippet_id="430174" snippet_file_name="blog_20140718_5_46349 ...

  8. [Angular] Provide Feedback to Progress Events with Angular’s HttpRequest Object

    In some cases your application might need to upload large amounts of data, such as files. Obviously ...

  9. HTTP Status 404 - /servlet/Item/AddItemServlet

    我想学习编程的人对404和500都是非常敏感非常熟悉的.在做DRP系统的时候多次遇到这两个错误,今天让我遇到他并且让我铭记他,那就是一个"/": 这是说jsp出问题了,并且找不到, ...

  10. 一个软件实现的Linux看门狗—soft_wdt

    soft_wdt(下面简称本软件)是一个软件实现的Linux看门狗. 本软件是一款开源.免费软件. 下载地址: https://github.com/sunmingbao/soft-wdt/archi ...