1. 程式人生 > >Windows程序同步之互斥量核心物件(Mutex)

Windows程序同步之互斥量核心物件(Mutex)

我們知道程序間的同步操作都是要藉助核心來完成的,和同一個程序中的執行緒同步只需要在使用者模式下是有很大差別的,當然,對於程序安全的,對於執行緒肯定也是安全的,但在使用者模式下的執行緒同步所需消耗的代價相對於通過核心完成的同步是很小的。所以不要利用程序同步的方式來進行同一程序中執行緒的同步。

這裡先討論程序同步的方式之一:互斥量(Mutex)。

互斥量核心物件能夠確保一個程序獨佔對一個資源的訪問。互斥量與關鍵段(執行緒同步方式)的行為完全相同,當互斥量是核心物件,而關鍵段是使用者模式下的的同步物件。

互斥量物件包含:一個執行緒ID,使用計數和遞迴計數。執行緒ID表示當前佔用該互斥量的執行緒

ID,遞迴計數表示該執行緒佔用互斥量的次數,使用計數表示使用互斥量物件的不同執行緒的個數。

互斥量物件有許多用途,它是使用最為頻繁的核心物件之一,一般用來對多個程序訪問同一塊記憶體進行同步。

互斥量的使用如下:

1CreateMutex()

HANDLE WINAPI CreateMutex(  
  _In_opt_  LPSECURITY_ATTRIBUTES lpMutexAttributes,  
  _In_      BOOL bInitialOwner,  
  _In_opt_  LPCTSTR lpName  
);  

lpMutexAttributes:互斥量安全訪問屬性,一般置為NULL

bInitialOwner:控制互斥量的初始狀態,一般設定為false,是互斥量的執行緒ID和遞迴計數都設為0,表示互斥量不被任何程序佔用,處於觸發狀態,其他程序可以進行呼叫等待函式,獲得該互斥量物件,獲得對同步資源的佔用。如果初始值設為true,互斥量的執行緒ID設定為當前執行緒,遞迴計數設為1,表示當前執行緒佔用互斥量物件,擁有對同步資源的獨佔,互斥量處於未觸發狀態。

lpName:用於建立有名的核心物件,即用來建立跨程序邊界的核心物件。

CreateMutex用於建立名為lpName的互斥量核心物件,並返回指向該核心物件的控制代碼。如果該核心物件已經存在,那麼CreateMutex

會返回該核心物件的控制代碼,並通過系統返回錯誤ERROR_ALREADY_EXISTS,通過GetLastError()獲得。

2OpenMutex()

HANDLE WINAPI OpenMutex(  
  _In_  DWORD dwDesiredAccess,  
  _In_  BOOL bInheritHandle,  
  _In_  LPCTSTR lpName  
);  

dwDesiredAccess:對互斥量物件訪問許可權的設定,MUTEX_ALL_ACCESS 請求對互斥體的完全訪問,MUTEX_MODIFY_STATE 允許使用 ReleaseMutex 函式,SYNCHRONIZE 允許互斥體物件同步使用;

bInheritHandle:是否希望子程序繼承互斥量物件的控制代碼,一般設定為false

lpName:要開啟的互斥量物件的名稱;

OpenMutex用於開啟已經存在的互斥量物件,若開啟成功,則返回指向該核心物件的控制代碼,否則返回NULL。可以使用CreateMutex來實現開啟功能。

3WaitForSingleObject()

DWORD WINAPI WaitForSingleObject(  
  _In_  HANDLE hHandle,  
  _In_  DWORD dwMilliseconds  
);  

hHandle:指向核心物件的控制代碼;

dwMilliseconds:執行緒最大等待多長時間,直到該物件被觸發。經常使用INFINITE,表示阻塞等待。

WaitForSingleObject被稱呼為等待函式,是等待核心物件被觸發通用的等待函式,被用在所有的核心物件觸發等待中。等待函式在等待互斥量核心物件時,會判斷互斥量的執行緒ID是否為0,如果為非0,表示互斥量處於未觸發狀態,等待函式會被阻塞。當另外一個執行緒將互斥量釋放,使其執行緒ID0時,系統會喚醒阻塞的等待函式,把互斥量的執行緒ID設定為它的執行緒ID,使其成為可排程狀態

還有一個WaitForMultipleObject函式,用於等待多個核心物件被觸發。

4ReleaseMutex()


BOOL WINAPI ReleaseMutex(  
  _In_  HANDLE hMutex  
);  

hMutex:互斥量核心物件的控制代碼;

當一個執行緒訪問完通過互斥量物件獲得的獨佔資源後,應該呼叫ReleaseMutex,使互斥量恢復為未觸發狀態。即設定互斥量物件的執行緒ID和遞迴計數為0,當遞迴計數大於1時,還有進行對應多次的ReleaseMutex

5CloseHandle()

BOOL WINAPI CloseHandle(  
  _In_  HANDLE hObject  
);  

hObject:指向核心物件的控制代碼

無論以什麼方式建立核心物件,我們都必須通過呼叫CloseHandle向系統表明結束使用核心物件。如果傳入的控制代碼有效,系統將獲得核心物件資料結構的地址,並將結構中的使用計數減1,如果使用計數0,就會將核心物件銷燬,從記憶體空間中擦除。

原文地址;http://blog.csdn.net/anonymalias/article/details/9080881

相關推薦

Windows程序同步互斥核心物件Mutex

我們知道程序間的同步操作都是要藉助核心來完成的,和同一個程序中的執行緒同步只需要在使用者模式下是有很大差別的,當然,對於程序安全的,對於執行緒肯定也是安全的,但在使用者模式下的執行緒同步所需消耗的代價相對於通過核心完成的同步是很小的。所以不要利用程序同步的方式來進行同一

Windows程序同步訊號核心物件Semaphore

訊號量核心物件主要包括三個部分:使用計數,最大資源計數,當前資源計數。 使用計數:和其他核心物件一樣,用來標識使用該事件物件的不同執行緒個數;最大資源計數:表示訊號量控制的最大資源的數目;當前資源計數:表示訊號量當前可用的資源數目; 訊號量使用規則如下: 如果當前資源計數大

6.程序同步互斥

互斥量mutex 程序間也可以使用互斥鎖,來達到同步的目的。但應在pthread_mutex_init初始化之前,修改其屬性為程序間共享。mutex的屬性修改函式主要有以下幾個。 互斥鎖API pthread_mutexattr_t mattr 型別 //用

Linux 學習筆記—執行緒同步互斥與條件變數

執行緒同步(同步的意思是協同步調) 執行緒同步機制包括互斥,讀寫鎖以及條件變數等 3.2.1 互斥量(互斥鎖) **互斥量本質是一把鎖,在訪問公共資源前對互斥量設定(加鎖),確保同一時間只有一個執行緒訪問資料,在訪問完成後再釋放(解鎖)互斥量。**在互斥量加鎖之

使用互斥物件Mutex實現不同程序間執行緒同步

不同程序的同步,可使用Mutex. 步驟為: 1.不同的程序,需要定義相同的Mutex名字。 CMutex g_mutex(FALSE,"Mutex_1"); 2.一個程序訪問資源時,把資源加鎖: g_mutex.Lock(); 3.操作資源 4.把資源解鎖。 g_mute

程序同步互斥

 程序同步是一個作業系統級別的概念,是在多道程式的環境下,存在著不同的制約關係,為了協調這種互相制約的關係,實現資源共享和程序協作,從而避免程序之間的衝突,引入了程序同步。而互斥和同步之間存在聯絡所以,這裡先引入互斥概念。1、概念     程序之間的間接制約關係。當一個程序進

Windows程序設計簡單的動畫效果小球彈一彈

Windows程序設計之小球彈一彈構造一個矩形位圖,位圖內有一個帶有陰影和紫色間隙的小球,程序使用定時器來控制小球的動作,實際上是每當接收到定時器消息時將位圖通過BitBlt函數復制到客戶區,每當小球碰撞到客戶區上下左右四邊時就反彈回來。下面代碼有本人的理解註釋可供參考,本人才疏學淺,不妥請見諒。效果圖如下:

windows程序設計》第一個窗口1

ati col clas where app byte bytes pixel over #if defined(UNICODE) && !defined(_UNICODE) #define _UNICODE #elif defined(_UNIC

windows程序設計》獲取文本尺寸04

new napi ica pan arrow lpar system dex wid 代碼如下: program Project2; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, windows,

windows程序設計》哆啦A夢10

use inf rect 菜單 wm_paint toc arc begin col 代碼如下: program Project2; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, windows,

windows程序設計》鼠標消息12

n) mouse wpar instance gin sla cat top cti 代碼如下: program Project2; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils,

windows程序設計》字符消息14

uri cal phi mes 顏色 程序 case lap uname 代碼如下: program Project2; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, windows,

Python路(第三十八篇) 併發程式設計:程序同步鎖/互斥鎖、訊號、事件、佇列、生產者消費者模型

一、程序鎖(同步鎖/互斥鎖) 程序之間資料不共享,但是共享同一套檔案系統,所以訪問同一個檔案,或同一個列印終端,是沒有問題的, 而共享帶來的是競爭,競爭帶來的結果就是錯亂,如何控制,就是加鎖處理。 例子 #併發執行,效率高,但競爭同一列印終端,帶來了列印錯亂 from multiproc

執行緒同步互斥訊號物件Semaphore

  訊號量物件對執行緒的同步方式與前面幾種方法不同,訊號允許多個執行緒和程序同時使用共享資源,這與作業系統中的PV操作相同。它指出了同時訪問共享資源的執行緒最大數目。它允許多個執行緒在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大執行緒數目。在用C

Windows執行緒同步互斥Mutex

執行緒同步的方式和機制臨界區、互斥區、事件、訊號量四種方式臨界區(Critical Section)、互斥量(Mutex)、訊號量(Semaphore)、事件(Event)的區別1、臨界區:通過對多執行緒的序列化來訪問公共資源或一段程式碼,速度快,適合控制資料訪問。在任意時刻

執行緒同步互斥物件通俗易懂

     先看售票系統的程式,看看多執行緒容易出什麼問題: #include <windows.h> #include <iostream.h> DWORD WINAPI Fun1Proc(LPVOID lpParameter); DWORD WI

Linux程式設計學習筆記----多執行緒程式設計執行緒同步機制互斥(鎖)與讀寫鎖

互斥鎖通訊機制 基本原理 互斥鎖以排他方式防止共享資料被併發訪問,互斥鎖是一個二元變數,狀態為開(0)和關(1),將某個共享資源與某個互斥鎖邏輯上繫結之後,對該資源的訪問操作如下: (1)在訪問該資源之前需要首先申請互斥鎖,如果鎖處於開狀態,則申請得到鎖並立即上鎖(關),防

程序同步互斥經典問題二

讀者/寫者問題 問題描述: 有兩組併發程序:讀者和寫者,共享一組資料區 要求: 允許多個讀者同時進行讀操作 不允許讀者、寫著同時進行操作 不允許多個寫著同時進行操作 解答如下:

Linux程序同步POSIX訊號

POSIX訊號量是屬於POSIX標準系統介面定義的實時擴充套件部分。在SUS(Single UNIX Specification)單一規範中,定義的XSI IPC中也同樣定義了人們通常稱為System V訊號量的系統介面。訊號量作為程序間同步的工具是很常用的一種同步IPC型別。 在《UNIX網路程式設計 卷

用戶模式同步互斥體小解

用戶模式 lease class 必須 我們 bool body 多線程 inf 1.互斥體(互斥體類似於同步事件)互斥體可避免多個線程爭奪一個資源的問題,多線程環境下,如果一個線程獲得互斥體,不釋放的話其他的線程就獲得不了該資源它與同步事件的區別:是在同一個線程內它可以遞