互斥锁(子线程互斥)

#include "stdafx.h"
#include<process.h>
#include<iostream>
#include<windows.h>


HANDLE g_hMutex = NULL;
const int g_Number = 3;
DWORD WINAPI ThreadProc1(LPVOID lpParam);
DWORD WINAPI ThreadProc2(LPVOID lpParam);
DWORD WINAPI ThreadProc3(LPVOID lpParam);
int g_value = 0;


int _tmain(int argc, _TCHAR* argv[])
{
    g_hMutex = CreateMutex(NULL,false,NULL);
    //true表示主线程拥有互斥对象,但是主线程没有释放该对象,互斥对象谁拥有 谁释放
    //false表示当前没有线程拥有这个互斥对象


    HANDLE hThread[g_Number] = {0};
    int first = 1, second = 2, third = 3;
    hThread[0] = (HANDLE)_beginthreadex(NULL,0,(unsigned int(_stdcall*)(void*))&ThreadProc1,(LPVOID)first,0,NULL);
    hThread[1] = (HANDLE)_beginthreadex(NULL, 0, (unsigned int(_stdcall*)(void*))&ThreadProc2, (LPVOID)second, 0, NULL);
    hThread[2] = (HANDLE)_beginthreadex(NULL, 0, (unsigned int(_stdcall*)(void*))&ThreadProc3, (LPVOID)third, 0, NULL);
    WaitForMultipleObjects(g_Number,hThread,TRUE,INFINITE);  // 等待的类型, 如果为 TRUE ,表示除非对象都发出信号,否则就一直等待下去;如果 FALSE ,表示任何对象发出信号即可
    CloseHandle(hThread[0]);
    CloseHandle(hThread[1]);
    CloseHandle(hThread[2]);
    CloseHandle(g_hMutex);
return 0;
}
DWORD WINAPI ThreadProc1(LPVOID lpParam)
{
    for (int i = 0; i < 10; i++)
    {
        WaitForSingleObject(g_hMutex, INFINITE);//等待互斥量
        if (g_value < 5)
            std::cout << "线程1:"<<g_value++ << std::endl;
        ReleaseMutex(g_hMutex);
    }
    return 0;
}
DWORD WINAPI ThreadProc2(LPVOID lpParam)
{
    
    for (int i = 0; i < 10; i++)
    {
        WaitForSingleObject(g_hMutex, INFINITE);//等待互斥量
        if (g_value >= 5)
            std::cout << "线程2:" << g_value++ << std::endl;
        ReleaseMutex(g_hMutex);
    }
    return 0;
}
DWORD WINAPI ThreadProc3(LPVOID lpParam)
{
    
    for (int i = 0; i < 10; i++)
    {
        WaitForSingleObject(g_hMutex, INFINITE);//等待互斥量
        if (g_value > 5)
            std::cout << "线程3:" << g_value-- << std::endl;
        ReleaseMutex(g_hMutex);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值