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

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

  所謂同步,當流程1運行在線程1中,流程2運行在線程2中,流程2必須在流程1結束以後才能開始執行。你會怎麼作,全部就須要給出一個流程1結束的信號。多線程

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

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

#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個線程

相關文章
相關標籤/搜索