多線程之信號量(By C++)


  信號量在多線程中,主要是用於線程的同步或者限制線程運行的數量。

  所謂同步,當流程1運行在線程1中,流程2運行在線程2中,流程2必須在流程1結束之后才能開始執行。你會怎么做,所有就需要給出一個流程1結束的信號。

  在信號來之前,讓線程2先在某個位置等待,這個使用方式和互斥鎖有點類似,互斥從某種意義上也是一種同步,只是互斥鎖更傾向於保護共同資源。信號量大於0的時候就代表有信號,不需要等待,但不僅僅是1。

下面的這個例子設置了3個線程,設置最大同時只運行2個進程。

#include<Windows.h>
#include<iostream>
using namespace std;
//創建一個信號量
HANDLE hSemaphore;

//有參數
DWORD WINAPI MyThread2(LPVOID lpParamter)
{
    while (1)
    {
        WaitForSingleObject(hSemaphore,INFINITE);
        cout << "MyThread1 Runing :"<<"線程2" << endl;
        Sleep(2000);
        ReleaseSemaphore(hSemaphore,1,NULL);//釋放信號量 

    }
}
//無參數
DWORD WINAPI MyThread1(LPVOID lpParamter)
{
    while (1)
    {
        //信號量減1,如果等於0就進入睡眠,待大於0之后再減
        WaitForSingleObject(hSemaphore,INFINITE);
        cout << "MyThread2 Runing"<<"線程1" << endl;
        Sleep(2000);
        //信號量加1
        ReleaseSemaphore(hSemaphore,1,NULL);//釋放信號量 
    }
}
//無參數
DWORD WINAPI MyThread3(LPVOID lpParamter)
{
    while (1)
    {
        //信號量減1,如果等於0就進入睡眠,待大於0之后再減
        WaitForSingleObject(hSemaphore,INFINITE);
        cout << "MyThread2 Runing"<<"線程3" << endl;
        Sleep(2000);
        //釋放信號量,信號量加1
        ReleaseSemaphore(hSemaphore,2,NULL);
    }
}

int main()
{

    //創建一個信號量,2是初值,3是最大值
    hSemaphore  =CreateSemaphore(NULL,2,3,NULL);

    //第三個參數是線程函數的地址,第四個參數是傳到線程的參數指針
    HANDLE hThread = CreateThread(NULL, 0, MyThread1, NULL, 0, NULL);
    //釋放句柄
    CloseHandle(hThread);

    HANDLE hThread1 = CreateThread(NULL, 0, MyThread2, NULL, 0, NULL);
    CloseHandle(hThread);

    HANDLE hThread3 = CreateThread(NULL, 0, MyThread3, NULL, 0, NULL);
    //釋放句柄
    CloseHandle(hThread3);
    while(1);
    return 0;
}

結果可以看到,三個線程交替運行2個


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM