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

1、临界区:通过对多线程的串行化来訪问公共资源或一段代码,速度快,适合控制数据訪问。        

         2、相互排斥量:为协调共同对一个共享资源的单独訪问而设计的。        

         3、信号量:为控制一个具有有限数量用户资源而设计。        

         4、事  件:用来通知线程有一些事件已发生,从而启动后继任务的開始。

临界区(Critical?Section)(以win32系统为例)

保证在某一时刻仅仅有一个线程能訪问数据的简便办法。在随意时刻仅仅同意一个线程对共享资源进行訪问。假设有多个线程试图同一时候訪问临界区,那么在有一个线程进入后其它全部试图訪问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其它线程能够继续抢占,并以此达到用原子方式操作共享资源的目的。

临界区包括两个操作原语:

                EnterCriticalSection()进入临界区

                LeaveCriticalSection()离开临界区

EnterCriticalSection()语句运行后代码将进入临界区以后不管发生什么,必须确保与之匹配的LeaveCriticalSection()都可以被运行到。否则临界区保护的共享资源将永远不会被释放。尽管临界区同步速度非常快,但却仅仅能用来同步本进程内的线程,而不可用来同步多个进程中的线程。

相互排斥量(Mutex)

相互排斥量跟临界区非常相似,仅仅有拥有相互排斥对象的线程才具有訪问资源的权限,由于相互排斥对象仅仅有一个,因此就决定了不论什么情况下此共享资源都不会同一时候被多个线程所訪问。当前占领资源的线程在任务处理完后应将拥有的相互排斥对象交出,以便其它线程在获得后得以訪问资源。相互排斥量比临界区复杂。由于使用相互排斥不仅仅可以在同一应用程序不同线程中实现资源的安全共享,并且可以在不同应用程序的线程之间实现对资源的安全共享。        

相互排斥量包括的几个操作原语:      

        CreateMutex() 创建一个相互排斥量      

        OpenMutex() 打开一个相互排斥量 

        ReleaseMutex() 释放相互排斥量       

        WaitForMultipleObjects() 等待相互排斥量对象

信号量(Semaphores)

信号量对象对线程的同步方式与前面几种方法不同,信号同意多个线程同一时候使用共享资源,这与操作系统中的PV操作同样。它指出了同一时候訪问共享资源的线程最大数目。它同意多个线程在同一时刻訪问同一资源,可是须要限制在同一时刻訪问此资源的最大线程数目。在用CreateSemaphore()创建信号量时即要同一时候指出同意的最大资源计数和当前可用资源计数。通常是将当前可用资源计数设置为最大资源计数,每添加一个线程对共享资源的訪问,当前可用资源计数就会减1,仅仅要当前可用资源计数是大于0的,就能够发出信号量信号。可是当前可用计数减小到0时则说明当前占用资源的线程数已经达到了所同意的最大数目,不能在同意其它线程的进入,此时的信号量信号将无法发出。线程在处理完共享资源后,应在离开的同一时候通过ReleaseSemaphore()函数将当前可用资源计数加1。在不论什么时候当前可用资源计数决不可能大于最大资源计数。
       PV操作及信号量的概念都是由荷兰科学家E.W.Dijkstra提出的。信号量S是一个整数,S大于等于零时代表可供并发进程使用的资源实体数,但S小于零时则表示正在等待使用共享资源的进程数。

        P操作申请资源:      

                (1)S减1;       

                (2)若S减1后仍大于等于零,则进程继续运行;      

                (3)若S减1后小于零,则该进程被堵塞后进入与该信号相相应的队列中,然后转入进程调度。

        V操作 释放资源:      

                (1)S加1;       

        (2)若相加结果大于零,则进程继续运行;      

        (3)若相加结果小于等于零,则从该信号的等待队列中唤醒一个等待进程,然后再返回原进程继续运行或转入进程调度。        

信号量包括的几个操作原语:       

        CreateSemaphore() 创建一个信号量      

        OpenSemaphore() 打开一个信号量      

        ReleaseSemaphore() 释放信号量  

        WaitForSingleObject() 等待信号量



事件(Event)

        事件对象也能够通过通知操作的方式来保持线程的同步。而且能够实现不同进程中的线程同步操作。

信号量包括的几个操作原语:

        CreateEvent()创建一个信号量

        OpenEvent()打开一个事件

        SetEvent()?回置事件

        WaitForSingleObject()等待一个事件

        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

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

  1. 多线程相互排斥--mutex

    多线程之线程同步Mutex (功能与Critial Sections同样,可是属于内核对象,訪问速度较慢.能够被不同进程调用) 一 Mutex     相互排斥对象(mutex)内核对象可以确保线程拥 ...

  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. WebService什么?

    一.前言 我们或多或少都听过WebService(Web服务),有一段时间非常多计算机期刊.书籍和站点都大肆的提及和宣传WebService技术.当中不乏非常多吹嘘和做广告的成分.可是不得不承认的是W ...

  2. Linux中查看socket状态(转)

    Linux中查看socket状态:cat /proc/net/sockstat #(这个是ipv4的) sockets: used 137 TCP: inuse 49 orphan 0 tw 3272 ...

  3. Java基金会——JUnit

    JUnit 測试的重要性毋庸质疑.但怎样使測试更加准确和全面.而且独立于项目之外而且避免硬编码,JUnit给了我们一个非常好的解决方式. 能够说JUnit是为单元測试而生的,一个Java语言的单元測试 ...

  4. 开源备份软件bacula安装记录--包括备份-恢复演练

    该公司原先使用的备用机oracle-linux 5.7 不是很稳定执行.经常死机,新安装centos6.5, 即用bacula要备份的数据.在这里,有关安装故障记录,MEMO. 操作系统:centos ...

  5. 在用TabbarController中出现navigationController 嵌套报错

    假设出现: nested push animation can result in corrupted navigation bar Finishing up a navigation transit ...

  6. CodeForces 22D Segments 排序水问题

    主题链接:点击打开链接 升序右键点.采取正确的点 删边暴力 #include <cstdio> #include <cstring> #include <algorith ...

  7. nodejs显现events.js:72抛出错误

    随着人们开始学习,我用nodejs过程中遇到如下列错误执行: events.js:72 throw er; // Unhandled 'error' event ^ Error: listen EAD ...

  8. ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl

    原文:ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 第四章 组合控件开发CompositeControl 大家好,今天我们来实现一个自定义的控件,之前我们已经 ...

  9. UVa 11587 - Brick Game

    称号:背景:brick game有N块,给你一个整数的定数S,两个人轮流木: 的木块数是集合S中存在的随意数字.取走最后木块的人获胜.无法取则对方获胜. 题干:如今让你先取,给你一个你的结果序列串T, ...

  10. index_ss hint 使用的运行计划变化对照

    index_ss  hint 使用的运行计划变化对照 当中 buffer 代表:当前操作中发生的内存读次数,包括一致性读和当前读 尽管 emp 表记录数不多,可是buffer 读内存的次数区别还是有点 ...