不知道大家对多线程或多进程间的同步相互排斥的控制机制了解的怎么样,事实上有非常多种方法能够实现这个目的,可是这些方法事实上由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. 关于程序猿怎样降低程序Bug的若干建议

    毫无疑问,程序猿是善于思考问题的一族. 一个程序的编写都是通过:思考.设计.编写.调试.測试以及执行这些主要的阶段. 但大部分程序猿都有一个问题就是不太愿意測试自己的代码. 他们草草的调式完毕以后就觉 ...

  2. 删CentOS / RHEL库和配置文件(Repositories and configuraiton files)

    1 删除库简介 随着root权限执行以下的命令: # cd /etc/yum.repos.d/ 列出全部库(repo) #ls CentOS-Base.repo epel.repo mirrors-r ...

  3. Web静态和动态项目委托代理基于面向方面编程AOP

    本来每天更新,我一般喜欢晚上十二点的时候发文章,结果是不是愚人节?校内网也将是非常有趣,破,把我给打. ..好吧-从今天开始的话题AOP.AOP太重要了,所以把第二篇文章谈论这个话题,AOP它是Spr ...

  4. Xampp mysql无法启动的解决方案(转)

    如果出现mysql 无法启动表明在安装xampp 前已经安装了mysql,造成mysql服务无法启动. [mysql] MySQL Service detected with wrong path23 ...

  5. LightOJ1010---Knights in Chessboard (规律题)

    Given an m x n chessboard where you want to place chess knights. You have to find the number of maxi ...

  6. CodeForces 22D Segments 排序水问题

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

  7. Apple Watch 1.0 开发介绍 1.4 简介 使用iOS技术

    WatchKit extension可以使用iOS app同样的技术,但是由于他是extension,使用有些技术的时候会有限制,有些不推荐使用.下面是一些介绍以及什么时候使用什么技术: 有些需要权限 ...

  8. 安卓培训第五天---上传文件SD卡

    有关如何将文件上传到先说说SD卡: package com.example.lesson05_02; import java.io.File; import java.io.FileNotFoundE ...

  9. Notification和Activity交互

    概述 通知(Notification)就是程序在不影响用户操作的情况下,通过手机顶部弹出消息告诉用户的一种信息通知方式,而且能够通过下拉通知操作抽屉通知,实现Notification与活动.通知和服务 ...

  10. 3.cocos2dx它Menu,由menu为了实现场景切换

     1 头文件 TMenu.h #ifndef __TMENU_H__ #define __TMENU_H__ #include "cocos2d.h" USING_NS_CC; ...