1. 程式人生 > >執行緒同步之Semaphore

執行緒同步之Semaphore

執行緒同步之訊號量

Semaphore

訊號量。

它維護一個計數,當值大於0時,訊號量物件處於已傳信狀態。通常用數值表示可用資源的個數。

WaitForSingleObject()令訊號量減一;ReleaseSemaphore()令訊號量加一。

//Semaphore
//this example is from msdn
#include 
#include 

#define MAX_SEM_COUNT 6
#define THREADCOUNT 8

HANDLE ghSemaphore;

DWORD WINAPI ThreadProc( LPVOID );

int main( void )
{
    HANDLE aThread[THREADCOUNT];
    DWORD ThreadID;
    int i;

    // Create a semaphore with initial and max counts of MAX_SEM_COUNT

    ghSemaphore = CreateSemaphore( 
        NULL,           // default security attributes
        MAX_SEM_COUNT,  // initial count
        MAX_SEM_COUNT,  // maximum count
        NULL);          // unnamed semaphore
    if (ghSemaphore == NULL) 
    {
        printf("CreateSemaphore error: %d\n", GetLastError());
        return 1;
    }

    // Create worker threads
    for( i=0; i < THREADCOUNT; i++ ){
        aThread[i] = CreateThread( 
                     NULL,       // default security attributes
                     0,          // default stack size
                     (LPTHREAD_START_ROUTINE) ThreadProc, 
                     NULL,       // no thread function arguments
                     0,          // default creation flags
                     &ThreadID); // receive thread identifier
        if( aThread[i] == NULL ){
            printf("CreateThread error: %d\n", GetLastError());
            return 1;
        }
    }

    // Wait for all threads to terminate
    WaitForMultipleObjects(THREADCOUNT, aThread, TRUE, INFINITE);

    // Close thread and semaphore handles
    for( i=0; i < THREADCOUNT; i++ )
        CloseHandle(aThread[i]);
    CloseHandle(ghSemaphore);
    return 0;
}

DWORD WINAPI ThreadProc( LPVOID lpParam )
{
    // lpParam not used in this example
    UNREFERENCED_PARAMETER(lpParam);

    DWORD dwWaitResult; 
    BOOL bContinue=TRUE;

    while(bContinue)
    {
        // Try to enter the semaphore gate.
        dwWaitResult = WaitForSingleObject( 
            ghSemaphore,   // handle to semaphore
            1L);           // zero-second time-out interval
        switch (dwWaitResult) 
        { 
            // The semaphore object was signaled.
            case WAIT_OBJECT_0: 
                // TODO: Perform task
                printf("Thread %d: wait succeeded\n", GetCurrentThreadId());
                bContinue=FALSE;            

                // Simulate thread spending time on task
                Sleep(5);

                // Release the semaphore when task is finished
                if (!ReleaseSemaphore( 
                        ghSemaphore,  // handle to semaphore
                        1,            // increase count by one
                        NULL) )       // not interested in previous count
                {
                    printf("ReleaseSemaphore error: %d\n", GetLastError());
                }
                break; 

            // The semaphore was nonsignaled, so a time-out occurred.
            case WAIT_TIMEOUT: 
                printf("Thread %d: wait timed out\n", GetCurrentThreadId());
                break; 
        }
    }
    return TRUE;
}
/*
Thread 7752: wait succeeded
Thread 9520: wait succeeded
Thread 10852: wait succeeded
Thread 5352: wait succeeded
Thread 8164: wait succeeded
Thread 10060: wait succeeded
Thread 4800: wait timed out
Thread 4516: wait timed out
Thread 4516: wait timed out
Thread 4800: wait timed out
Thread 4800: wait timed out
Thread 4800: wait succeeded
Thread 4516: wait timed out
Thread 4516: wait succeeded
請按任意鍵繼續. . .
*/

微笑分析:

訊號量值為6,MAX_SEM_COUNT ,而用到訊號量的執行緒有8,THREADCOUNT,不包括main函式執行緒。所以前6個建立好的執行緒WaitForSingleObject()返回值為WAIT_OBJECT_0,不會阻塞。而接下來的執行緒WaitForSingleObject()返回值為 WAIT_TIMEOUT,它們等其他P操作成功的執行緒 Sleep(5)後做V操作,才能獲得WAIT_OBJECT_0返回值。
8個ThreadProc執行緒執行完畢,主函式中WaitForMultipleObjects()函式才返回。

相關推薦

python多執行————6、執行同步Semaphore

控制程式碼進入執行緒的數量,控制併發數量,可以使用訊號量Semaphore。 1、定義訊號量sem  =  threading.Semaphore(3)  #3為併發數量 2、消耗訊號量 sem.acquire() 3、釋放訊號量 sem.release()

Springboot 執行同步Semaphore 資源包的簡單使用

如果你有一個東西, 你想別人觸碰它的時候,不能同時觸碰,需要按照你想要的每次多少人來觸碰。 算了,不做比喻了,程式碼原理其實也簡單,我們直接先看程式碼,我再做簡單的解釋(估計不用看解釋也能懂): package com.semaphore.controller; import org.sp

執行同步Semaphore

執行緒同步之訊號量 Semaphore 訊號量。 它維護一個計數,當值大於0時,訊號量物件處於已傳信狀態。通常用數值表示可用資源的個數。 WaitForSingleObject()令訊號量減一;ReleaseSemaphore()令訊號量加一。 //Semaphore /

C#多執行開發10:執行同步Semaphore

Semaphore類表示訊號量。 訊號量和互斥類似,只是訊號量可以同時由多個執行緒使用,而互斥只能由一個執行緒使用。也就是說,使用訊號量時,可以多個執行緒同時訪問受保護的資源。下面例項演示了“學生到食

C++多執行同步Semaphore(訊號量)

一、執行緒間同步的幾種方式 從上篇博文中可以發現,當多個執行緒對同一資源進行使用時,會產生“爭奪”的情況,為了避免這種情況的產生,也就出現了執行緒間的同步這個技術。執行緒間的同步有多種方式,在接下來的博文中我會依次介紹幾種主流的同步方式,以及他們之間的區別。在

【Windows】執行漫談——.NET執行同步Interlocked和ReadWrite鎖

摘要: 本系列意在記錄Windwos執行緒的相關知識點,包括執行緒基礎、執行緒排程、執行緒同步、TLS、執行緒池等。 這篇來說說靜態的Interlocked類和ReadWrite鎖 .NET中的Interlock

併發程式設計-初始執行-同步lock 時間:2018/10/27

執行緒同步的方法之lock 先看一個簡單的例子 namespace _005程序同步lock { class Program { static int val1 = 0; //兩個執行緒都操作的一個靜態變數 static void Main(

執行(十四)執行同步技術Semaphore

理解: Semaphore通常用於限制可以訪問某些資源(物理或邏輯的)的執行緒數目,我們可以自己設定最大訪問量。它有兩個很常用的方法是acquire()和release(),分別是獲得許可和釋放許可。  借用武哥的理解: Semaphore相當於一個廁所,我在造的時候可以想

pyhon多執行——5、執行同步condition

如何使用多執行緒實現一問一答呢?可以使用condition中的notify和wait方法實現,看程式碼 import threading import time class XiaoAi(threading.Thread): def __init__(self,cond):

python多執行————4、執行同步Lock,RLock

     在多執行緒同時請求同一個資源並進行修改時可能會造成結果出錯,例如共享變數       from dis import dis import threading a = 0 def add(): global a

window下執行同步(Critical Sections(關鍵程式碼段、關鍵區域、臨界區域)----轉載

轉載:https://www.cnblogs.com/cyblogs/p/9948379.html    關鍵區域(CriticalSection) 臨界區是為了確保同一個程式碼片段在同一時間只能被一個執行緒訪問,與原子鎖不同的是臨界區是多條指令的鎖定,而原子

Linux執行同步條件變數pthread_cond_t

Linux執行緒同步之條件變數pthread_cond_t  一直以來都天真的認為執行緒間同步的方法只有訊號量,互斥量,郵箱,訊息佇列,知道最近開始研究一些Linux方面的程式碼才發現自己是多麼的很傻很天真。在Linux中還存在這一種叫做條件變數的東西。必須承認我在理解這個概念上花了很

執行同步——兩個執行序列順序列印奇數和偶數的兩種實現

題目:一道經典的執行緒併發的問題,執行緒a列印1、3、5……,執行緒b列印2、4、6……,兩個執行緒交替執行輸出1、2、3、4、5、6…… 要點: package com.test; import java.util.concurrent.locks.

Python並行程式設計(五):執行同步訊號量

1、基本概念       訊號量是由作業系統管理的一種抽象資料型別,用於在多執行緒中同步對共享資源的使用。本質上說,訊號量是一個內部資料,用於標明當前的共享資源可以有多少併發讀取。       同樣在threading中,訊號量有acquire和release兩個函式。       - 每當執行緒想要讀取關聯

Python並行程式設計(七):執行同步事件

1、基本概念       事件是執行緒之間用於通訊的物件。有的執行緒等待訊號,有的執行緒發出訊號。基本上事件物件都會維護一個內部變數,可以通過set方法設定為true,也可以通過clear方法設定為false。wait方法將會阻塞執行緒,直到內部變數為true。 2、使用用例 # coding : utf

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

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

Linux 學習筆記—執行同步讀寫鎖、自旋鎖、屏障

3.2.1 讀寫鎖 讀寫鎖和互斥體類似,不過讀寫鎖有更高的並行性,互斥體要麼是鎖住狀態,要麼是不加鎖狀態,而且一次只有一個執行緒可以對其加鎖。而讀寫鎖可以有3個狀態,讀模式下鎖住狀態,寫模式下鎖住狀態,不加鎖狀態。一次只有一個執行緒可以佔有寫模式的讀寫鎖,但是多

孤荷凌寒自學python第四十三天python 的執行同步Queue物件

 孤荷凌寒自學python第四十三天python的執行緒同步之Queue物件   (完整學習過程螢幕記錄視訊地址在文末,手寫筆記在文末) Queue物件是直接操作佇列池的物件,佇列中可以存放多種物件,當然也就可以存放執行緒物件,將多個執行緒物件存放於佇列池中之後,就能非常顯式的

Windows執行同步互斥鎖(Mutex)

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

Linux 多執行同步哲學家用餐問題

問題描述: 有五個哲學家公用一張餐桌,分別坐在周圍的五張椅子上,在餐桌上有五個碗和五隻筷子,他們的生活方式是交替地進行思考和用餐。平時,一個哲學家進行思考,飢餓時便試圖拿取其左右最靠近他的筷子,只有在他拿到兩隻筷子時才能進餐,進餐完畢,放下筷子繼續思考。(計算機作業系統 第