C++多线程同步技巧--- 互斥体

Posted peterz1997

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++多线程同步技巧--- 互斥体相关的知识,希望对你有一定的参考价值。

简介

Windows互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问,在线程同步与保证程序单体运行上都有相当大的用处。

代码样例

////////////////////////////////
//
// FileName : MutexDemo.cpp
// Creator : PeterZheng
// Date : 2018/10/23 21:27
// Comment : The usage of "CreateMutex"
//
////////////////////////////////

#pragma once

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <windows.h>

using namespace std;

DWORD WINAPI Func1(LPVOID lpParam);
DWORD WINAPI Func2(LPVOID lpParam);

HANDLE hMutex = NULL;
int g_num = 0;

DWORD WINAPI Func1(LPVOID lpParam)
{
    while (g_num < 100)
    {
        WaitForSingleObject(hMutex, INFINITE);
        cout << "Count: " << g_num << endl;
        g_num++;
        Sleep(10);
        ReleaseMutex(hMutex); // 释放互斥体
    }
    return 0;
}

DWORD WINAPI Func2(LPVOID lpParam)
{
    while (g_num < 100)
    {
        WaitForSingleObject(hMutex, INFINITE);
        cout << "Count: " << g_num << endl;
        g_num++;
        Sleep(10);
        ReleaseMutex(hMutex);
    }
    return 0;
}

int main(void)
{
    hMutex = CreateMutex(NULL, FALSE, "Mutex"); // 创建互斥体
    HANDLE hThread[2] = { 0 };
    hThread[0] = CreateThread(NULL, 0, Func1, NULL, 0, NULL); // 创建线程1
    hThread[1] = CreateThread(NULL, 0, Func2, NULL, 0, NULL); // 创建线程2
    WaitForMultipleObjects(2, hThread, TRUE, INFINITE); // 等待线程执行结束
    system("pause");
    return 0;
}

以上是关于C++多线程同步技巧--- 互斥体的主要内容,如果未能解决你的问题,请参考以下文章

用户模式同步之互斥体小解

多线程多线程同步_Critical Section临界区

转载5天不再惧怕多线程——第三天 互斥体

C++ 中的异步线程安全日志记录(无互斥体)

线程资源同步——互斥量和条件变量

C++多线程同步技巧 --- 临界区