【Windows原理】线程同步-互斥体

本文通过一个具体的C++示例程序,详细介绍了Windows环境下线程间的同步机制,特别是使用互斥体(Mutex)来确保多个线程对共享资源的安全访问。通过两个线程交替打印递增整数的例子,展示了如何利用互斥体避免竞态条件,从而保证了程序的正确运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

int g_num = 0;
HANDLE g_hMutex = nullptr;
DWORD WINAPI ThreadProcA(LPVOID lpParam)
{
    for (int i = 0; i < 5;i++)
    {
        //等待g_hMutex信号,如果有信号,把它设置为无信号状态,
        // 然后执行后面的代码
        // 
        // g_hMutex就被当前线程拥有,其他线程布恩那个调用ReleaseMutex释放
        // 只有当前线程可以调用ReleaseMutex使g_hMutex变为有信号
        // 加入拥有者线程,因为某种原因,线程崩溃,退出
        // 系统会把当前线程所占用的互斥体重新设置为有信号状态
        // 其他等待线程可以立刻拥有
        // 如果当前线程假死,其他线程陪着它卡死
        WaitForSingleObject(g_hMutex, INFINITE);
        printf("%d\n",g_num++);
        ReleaseMutex(g_hMutex);
    }
    return 0;
}
DWORD WINAPI ThreadProcB(LPVOID lpParam)
{
    for (int i = 0; i < 5;i++)
    {
        WaitForSingleObject(g_hMutex,INFINITE);
        printf("%d\n",g_num++);
        ReleaseMutex(g_hMutex);
    }
    return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
    /*
     * 创建互斥体对象CreateMutex
     * 参数1:安全属性,默认
     * 参数2:创建的时候,是否占信号,g_hMutex处于有信号状态
     * TRUE,g_hMutex就会被主线程占用,下面两个子线程就会卡死
     * 参数3: 互斥体是否有名字
     **/
    if (!(g_hMutex = CreateMutex(NULL, FALSE, NULL)))return 0;

    HANDLE hHandle[2] = {};
    hHandle[1] = CreateThread(NULL, 0, ThreadProcA, NULL, 0, NULL);
    hHandle[2] = CreateThread(NULL, 0, ThreadProcB, NULL, 0, NULL);
    // 等待所有线程全部返回
    WaitForMultipleObjects(2, hHandle, TRUE, INFINITE);
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值