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;
}

原文地址:https://www.cnblogs.com/PeterZ1997/p/10524673.html

时间: 2024-10-07 05:16:03

C++多线程同步技巧(三)--- 互斥体的相关文章

VC++多线程同步(一) Mutex互斥量

一 .同步机制的引入目的是为了解决三个主要问题 1为了控制线程之间共享资源的同步访问,保证共享资源的完整性.(比如一个线程正在更新一个数据,而另外一个线程正在读取该数据,那么就不知道该数据是新的还是旧的,为了避免这种状况的发生) 2确保线程之间的动作,以制定的次序发送,例如一个线程的触发,需要另外一个线程的结果,作为条件. 3为了控制某一个共享资源的最大访问量,例如我们同时只能处理5个客户的请求,这时候,我们需要放到队列进行等待. 二.同步概念就是等待 WIN32  提供了API 等待函数 DW

C++多线程同步技巧(二)--- 事件

简介 Windows在线程同步方面提供了多种信号处理机制,其中一种便是使用 CreateEvent() 函数创建事件,然后使用信号控制同步.其中将事件变为有信号可使用 SetEvent() 函数,将事件信号复位(变为无信号)可使用 ResetEvent() 函数,信号可以配合 WaitForSingleObject() 函数进行控制,当有信号时,此函数便会放行:无信号时,此函数会将阻塞. 提示: CreateEvent() 函数的参数 bManualReset 的含义是信号是否由人工复位,如果选

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

简介 C++中关于多线程的内容对于构建工程来说是至关重要的,C++本身也对关于多线程的操作提供了很好的支持.本章笔者就来介绍一下C++有关于多线程的重要知识点---临界区. 临界区的作用 线程就像是进程的影子,可以帮助进程几乎在同一个时间内执行更多的任务.但是由于线程不占有资源,所有的线程共享进程的资源,这样就导致多个线程在共享进程资源的时候会出现抢夺资源的情况,这些会被抢夺的资源就被称为是临界资源,例如打印机资源,文件读写,如果出现线程抢占,就会导致输出混乱.所以我们在进行对临界资源访问的时候

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

1.互斥体(互斥体类似于同步事件)互斥体可避免多个线程争夺一个资源的问题,多线程环境下,如果一个线程获得互斥体,不释放的话其他的线程就获得不了该资源它与同步事件的区别:是在同一个线程内它可以递归获得互斥体,也就是这个线程获得互斥体后对再次去获得认可不排斥,同步我们显而易见的得知不允许这样他有激发未激发两种状态,记住!!!获得互斥体是未激发状态,释放互斥体是激发状态,他和信号量区别清楚同样使用它首先要初始化;CreateMutex(SECURITY,BOOL(是否被占有),LPCTSTR(name

016 Event互斥体 8

●  CreateMutex 函数原型 1 HANDLE WINAPI CreateMutex( 2 _In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes, 3 _In_ BOOL bInitialOwner, 4 _In_opt_ LPCTSTR lpName 5 ); ○ 参数1:lpMutexAttributes [in, optional] 指向SECURITY_ATTRIBUTES结构的指针.如果此参数为NULL,则处理不能由子进程继承. ○

windows平台多线程同步实现之Mutex对象的使用

windows平台多线程同步实现之MutexMutex对象的使用 前言 线程组成: 线程的内核对象,操作系统用来管理该线程的数据结构. 线程堆栈,它用于维护线程在执行代码时需要的所有参数和局部变量. ??操作系统为每一个运行线程安排一定的CPU时间 -- 时间片.系统通过一种循环的方式为线程提供时间片,线程在自己的时间内运行,多个线程不断地切换运行,因时间片相当短,因此,给用户的感觉,就好像线程是同时运行的一样. ??单cpu计算机一个时间只能运行一个线程,如果计算机拥有多个CPU,线程就能真正

多线程同步系列之二-----关键区

关键区对象为:CRITICAL_SECTION 当某个线程进入关键区之后,其他线程将 阻塞等待,知道该线程释放关键区的拥有权. 关键区同步主要有以下几个API 初始化关键区对象,无返回值,传入一个关键区对象的指针. 该函数在使用完关键区之后删除关键区对象,无返回值,同样传入一个关键区对象指针 该函数为进入关键区函数,传入的参数为关键区对象指针,无返回值.如果另外一个线程正拥有关键区的所有 权,那么该函数将阻塞,直到其他线程释放关键区的所有权之后,该函数才能继续执行进入关键区. 该函数与Enter

windows下多线程同步(利用事件对象,互斥对象,关键代码段)实现

一:利用事件实现线程同步 1.createthread函数的用法 hThread = CreateThread(&security_attributes, dwStackSize, ThreadProc,pParam, dwFlags, &idThread) ; HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAdd

[转载] 《重要》内核下各种同步处理方法(自旋锁、信号灯、互斥体…)

本文转载自: http://www.blogfshare.com/kernel-synchronization.html 1.在支持多线程的操作系统下,有些函数会出现不可重入的现象.所谓“可重入”是指函数的执行结果不和执行顺序有关.反之如果执行结果和执行顺序有关,则称这个函数是“不可重入”的. 2.Windows将中断的概念进行了扩展,提出一个中断请求级(IRQL)的概念.其中规定了32个中断请求级别,分别是0~2级别为软件中断,3~31级为硬件中断,其中数字从0~31,优先级别逐次递增. 在内