c++多线程重点难点(四)semaphore

来源:互联网 发布:三拼域名 不值钱 编辑:程序博客网 时间:2024/06/06 02:35

信号量可以实现线程间的同步,使用非常广泛

信号量常用的三个函数:
创建信号量:CreateSemaphore
开启信号量:OpenSemaphore
增加信号量:ReleaseSemaphore
由于信号量是内核对象,因此使用CloseHandle()就可以完成清理与销毁了。

信号量的实现代码:

#include <stdio.h>#include <process.h>#include <windows.h>long g_nNum;unsigned int __stdcall Fun(void *pPM);const int THREAD_NUM = 10;//信号量与关键段HANDLE            g_hThreadParameter;CRITICAL_SECTION  g_csThreadCode;int main(){    printf("     经典线程同步 信号量Semaphore\n");    printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");    //初始化信号量和关键段    g_hThreadParameter = CreateSemaphore(NULL, 0, 1, NULL);//当前0个资源,最大允许1个同时访问    InitializeCriticalSection(&g_csThreadCode);    HANDLE  handle[THREAD_NUM];     g_nNum = 0;    int i = 0;    while (i < THREAD_NUM)     {        handle[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, &i, 0, NULL);        WaitForSingleObject(g_hThreadParameter, INFINITE);//等待信号量>0        ++i;    }    WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);    //销毁信号量和关键段    DeleteCriticalSection(&g_csThreadCode);    CloseHandle(g_hThreadParameter);    for (i = 0; i < THREAD_NUM; i++)        CloseHandle(handle[i]);    return 0;}unsigned int __stdcall Fun(void *pPM){    int nThreadNum = *(int *)pPM;    ReleaseSemaphore(g_hThreadParameter, 1, NULL);//信号量++    Sleep(50);//some work should to do    EnterCriticalSection(&g_csThreadCode);    ++g_nNum;    Sleep(0);//some work should to do    printf("线程编号为%d  全局资源值为%d\n", nThreadNum, g_nNum);    LeaveCriticalSection(&g_csThreadCode);    return 0;}

代码源地址:http://blog.csdn.net/morewindows/article/details/7481609
msdn实现地址:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms686946(v=vs.85).aspx

原创粉丝点击