【Win32多线程】同步机制(Critical section、Mutexes、Semaphore、Event Object)

CriticalSection 和Mutex 性能比较 Windows下100万次加/解锁测试: CriticalSection用时:31ms Mutex用时:953ms 结论:CriticalSection性能远远高于Mutex(高出约30倍)。因此,在能用CriticalSection时绝不用Mutex,当然,后者可命名,而前者不行,因此,Mutex可用于进程间通信,但CriticalSection通常只能用于线程间通信。 另外,Windows上Mutex和CriticalSection都是缺省Recursive的(且不能被改变,如要实现non-recurs 阅读详情

线程同步能避免出现“race conditions”(竞争条件)和“data corruption”(数据破坏)的情况。
同步(synchronous)与异步(asynchronous)的定义:

当程序1调用程序2时,程序1停下不动,直到程序2完成回到程序1来,程序1才继续下去,这就是“同步”。
如果程序1调用程序2后,径自继续自己的下一个动作,那么两者之间就是“异步”。
Win32 API 中的SendMessage()是同步行为,而PostMessage()是异步行为。


win32中关于进程和线程的协调工作是由同步机制来完成的。同步机制相当于线程之间的红绿灯。

-----Critical Sections(关键区域、临界区域)
win32中最容易使用的同步机制就是critical sections.所谓critical sections意指一小块“用来处理一份被共享之资源

”的程序代码。这里的资源并不是来着.RES的Windows资源,而是广义地指一块内存、一个数据结构、一个文件,或任何其

他具有“使用之排他性”的东西。
为了防止问题的发生,一次只能有一个线程获准进入critical section中。实施的方式就是在程序中加上“进入”或“离

开”critical section的操作。

在win32中可以为一个需要保护的资源声明一个CRITICAL_SECTION类型的变量。这个变量扮演红绿灯的角色。

Critical section 并不是核心对象,没有handle这样的东西,它和核心对象不同,不存在进程的内存空间。你应该将一个

类型为CRITICAL_SECTION的局部变量初始化,方法是调用InitializeCriticalSection();
VOID InitializeCriticalSection(
  LPCRITICAL_SECTION lpCriticalSection  // critical section 一个指针,指向欲初始化的CRITICAL_SECTION变量
);

当用完critical section时,必须调用DeleteCriticalSection()清除它。这个函数并没有“释放对象”的意义在里面,不

同于C++中的delete运算符。
VOID DeleteCriticalSection(
  LPCRITICAL_SECTION lpCriticalSection   // critical section指向不需要的CRITICAL_SECTION变量
);

Critical section同步机制示例:
CRITICAL_SECTION gCriticalSection;
void CreateDeleteCriticalSection()
{
InitializeCriticalSection(&gCriticalSection);
/*Do Something here */
DeleteCriticalSection(&gCriticalSection);

}

一旦critical section 被初始化,每一个线程就可以进入其中,只要它通过了EnterCriticalSection()这一关。
VOID EnterCriticalSection(
  LPCRITICAL_SECTION lpCriticalSection  // critical section指向一个你即将锁定的CRITICAL_SECTION变量
);

当线程准备好要离开critical seciton 时,必须调用LeaveCriticalSection():
VOID LeaveCriticalSection(
  LPCRITICAL_SECTION lpCriticalSection   // critical section指向一个即将解除锁定的CRITICAL_SECTION变量
);

void UpdateData()
{
EnterCriticalSection(&gCriticalSection);
/*Update the resource*/
LeaveCriticalSection(&gCriticalSection);
}


使用critical section操作避免链表insert和add同时发生:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

typedef struct _Node
{
 struct _Node *next;
 int data;

}Node;
typedef struct _List
{
 Node *head;
 CRITICAL_SECTION critical_sec;
}List;

List *CreateList()
{
 List *pList=(List *)malloc(sizeof(List));
 pList->head=NULL;
 InitializeCriticalSection(&pList->critical_sec);
 return pList;
}

void DeleteList(List *pList)
{
 DeleteCriticalSection(&pList->critical_sec);
 free(pList);
}
void AddHead(List * pList,Node *node)
{
 EnterCriticalSection(&pList->critical_sec);
 node->next=pList->head;
 pList->head=node;
 LeaveCriticalSection(&pList->critical_sec);

}

void Insert(List *pList,Node *afterNode,Node *newNode)
{
 EnterCriticalSection(&pList->critical_sec);
 if(afterNode==NULL)
 {
  AddHead(pList,newNode);
 }
 else
 {
  newNode->next=afterNode->next;
  afterNode->next=newNode;
 }
LeaveCriticalSection(&pList->critical_sec);
}

Node * Next(List *pList,Node *node)
{
Node *next;
EnterCriticalSection(&pList->critical_sec);
next=node->next;
LeaveCriticalSection(&pList->critical_sec);
return next;
}


一旦线程进入一个critical section,它就能够一再重复进入该critical section。如Insert()可以调用AddHead()而不需

要先调用LeaveCriticalSection()。


----最小锁定时间
不要长时间锁定一份资源,不要在一个critical section中调用Sleep()或任何API函数
Q:如果线程在critical section中停留很久,会怎么样?
A:不会出现任何错误信息。当主线程需要这个锁定的资源时,程序会挂在那,动也不动。

Q:如果线程在critical section中结束,会怎么样?
A:Critical section的一个缺点就是没有办法获知进入critical section中的那个线程的生死。如果进入critical

section的那个线程结束了,而没有调用LeaveCriticalSection()的话,系统没有办法将critical section清除。如果需要

那样的机能,应该使用mutex.


----死锁
任何时候,当一段代码需要两个资源时,都有潜在性的死锁阴影。

哲学家进餐问题要求同一时刻取两只筷子而不是一只筷子。我能够等待一个以上的critical sections吗?

WaitForMultipleObjects()允许你对操作系统发生等待要求。直到所有指定的对象都激活才返回。但是它等待的只是核心

对象,critical section并不是核心对象(它没有handle),因而必须使用win32中的同步机制:mutex;

-----互斥器(Mutexex)
Win32的Mutex用途和critical section非常类似,但是它牺牲速度以增加弹性。一个时间内只能够有一个线程拥有mutex,就犹如同一个时间内只能够有一线程进入同一个critical section一样。

mutex和critical section的差别:
  1.锁住一个未被拥有的mutex,比锁住一个未被拥有的critical section,需要花费几乎100倍的时间。因为critical section 不需要进入操作系统的核心,直接在“user mode”就可能进行操作。
  2.Mutexes可以跨进程使用。Critical section只能够在同一个进程中使用。
  3.等待一个mutex时,可以指定“结束等待”的时间长度。但对于critical section不行。
两种对象的相关函数比较:

CRITICAL_SECTION                        Mutex核心对象
InitializeCriticalSection()                   CreateMutex()
                                                              OpenMutex()
EnterCriticalSection()                        WaitForSingleObject();
                                                                WaitForMultipleObjects();
                                                               MsgWaitForMultipleObjects();
LeaveCriticalSection()                  ReleaseMutex();
DeleteCriticalSection()                 CloseHandle();

为了能够跨进程使用同一个mutex,在产生mutex时指定其名称,不使用句柄。

----产生一个互斥器Mutex
 Mutex是一个核心对象,被保存在系统核心之中,并且和其他核心对象一样,有所谓的引用计数器。利用CreateMutex()产生一个mutex:
HANDLE CreateMutex(
  LPSECURITY_ATTRIBUTES lpMutexAttributes,  // SD 安全属性
  BOOL bInitialOwner,                       // initial owner mutex的拥有者,如果设置为TRUE,则拥有者为调用者
  LPCTSTR lpName                            // object name   mutex的名称,是一个字符串,可以根据名称使用   

                                                   mutex
);


如果不需要一个mutex,可以调用CloseHandle()将它关闭。

----打开一个互斥器(Mutex)
如果mutex已经产生,并且有一个名字。那么任何其他的线程和进程都可根据名称来打开那个mutex.
HANDLE OpenMutex(
  DWORD dwDesiredAccess,  // access
  BOOL bInheritHandle,    // inheritance option
  LPCTSTR lpName          // object name
);


----锁住一个互斥器(Mutex)
想获得一个mutex的拥有权,使用Win32 的Wait()函数。Wait()函数对mutex所做的事情和EnterCriticalSection()对critical section所做的事情差不多。

 一旦没有任何线程拥有mutex,这个mutex便处于激发状态。因此,如果没有任何线程有用mutex,Wait()便会成功。
BOOL ReleaseMutex(
  HANDLE hMutex   // handle to mutex
);

Mutex的拥有权并不是属于产生它的线程,而是那个最后对Mutex进行Wait..()操作并且没有进行ReleaseMutex()操作的线

程。线程拥有mutex就像线程进入critical section一样,一次只能有一个线程拥有该mutex.


----处理被舍弃的互斥器(Mutexes)
  在一个程序中,线程绝对不应该在它即将结束前还拥有一个mutex,因为这意味着线程没有能够适当的清初其资源。
  因为某种原因,线程可能没有在结束前调用ReleaseMutex().为了解决这个问题,mutex有一个非常重要的特性。这个性质是同步机制中独一无二的。

  任何时候想锁住超过一个以上的同步对象,就有死锁的潜在病因。如果在相同的实际把所有的对象都锁住,问题就可以解决。
新版SwapList();

typedef struct _Node
{
 struct _Node *next;
 int data;

}Node;
typedef struct _List
{
 Node *head;
 HANDLE hMutex;
}List;
void SwapLists(struct List *list1,Struct List *list2)
{
struct List *tmp_list;
HANDLE arrhandles[2];
arrhandles[0]=list1->hMutex;
arrhandles[1]=list2->hMutex;
WaitForMultipleObjects(2,arrHandles,TRUE,INFINITES);
/*相关操作*/
ReleaseMutex(arrhandles[0]);
ReleaseMutex(arrhandles[1]);


}


-----信号量(Semaphores)
 
信号量机制可以有效的解决生产者和消费者问题。
Win32中一个semaphore可以被锁住最多n次,其中n是semaphore被产生时指定的。n代表“可以锁住一份资源”的线程个数

,并非单独一个线程就不能够拥有所有的锁定。
mutex是sempahore的一种退化。如果你产生一个semaphore并令最大值为1,那就是一个mutex.故mutex又称为binary  semaphore.
在Win32中semaphores被使用的情况少,因为有Mutex存在。
  a.产生信号量CreateSemaphore();
HANDLE CreateSemaphore(
  LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // SD
  LONG lInitialCount,                          // initial count  semaphore的初值,》0&&《IMaximumCount
  LONG lMaximumCount,                          // maximum count 线程的最多个数
  LPCTSTR lpName                               // object name  信号量的名字
);
semaphore的现值代表目前可用的资源数。一旦semaphore的值降低到0,就表示资源耗尽。任何线程调用Wait...()必须等待,直到某个锁定被解除为止。
b.解除锁定(Releasing Locks)
  调用ReleaseSemaphore(),并将现值加1,并传回semaphore的前一个现值。
BOOL ReleaseSemaphore(
  HANDLE hSemaphore,       // handle to semaphore
  LONG lReleaseCount,      // count increment amount
  LPLONG lpPreviousCount   // previous count
);
与mutex不同的是,调用ReleaseSemaphore()的那个线程,并不一定就是调用Wait..()的那个线程。任何线程都可以在任何时间调用ReleaseSemaphore(),解除被任何线程锁定的semaphore.

 

-----事件(Event Objects)
Win32中最具有弹性的同步机制就是events 对象了。Event对象是一种核心对象。它的唯一目的就是成为激发状态或未激发状态。这两种状态完全有程序来控制,不会成为wait..()函数的副作用。与Mutexes和semaphores就不一样了,它们的状态会因为WaitForSingleObject()直接的函数调用而变化。你可以精确告诉一个event对象做什么事情,以及什么时候去做。
 
a.产生一个event对象

HANDLE CreateEvent(
  LPSECURITY_ATTRIBUTES lpEventAttributes, // SD
  BOOL bManualReset,                       // reset type 如果为false,这个event现在将变成激发状态之后,自动 重置为非激发状态,如果为True,不会自动重置,必须靠程序 (ResetEvent)操作才能激发状态的event重置为非激发状态                                                        
  BOOL bInitialState,                      // initial state ,True表示一开始就处于激发状态,否则一开始为非激发状态                                                 
  LPCTSTR lpName                           // object name 
);

SetEvent()   把event对象设为激发状态
ResetEvent()  把event对象设为非激发状态
PulseEvent() 如果是一个Manual Reset Event:把event对象设为激发状态。唤醒所有的等待线程。然后event恢复为未激发状态。如果是一个Auto Reset Event:把event 对象设为激发状态,唤醒“一个”等待中的线程,然后event恢复为非激发状态。


同步机制总结


a.Critical Section
   Critical Section(临界区)用来实现“排他性占有”。适用范围是单一进程的各个线程之间。它是(1)一个局部性对象,不是核心对象,快速而有效率,不能够同时有一个以上的critical section被等待无法侦测是否已被某个线程放弃

b.Mutex
它是一个核心对象,可以在不同的线程之间实现“排他性占有”,甚至那些线程属于不同的进程。它是一个核心对象。
如果拥有mutex的那个线程结束,则会产生一个“abandoned”错误信息。可以使用Wait...()等待一个mutex.可以具名,因此可卡因被其他进程开启。只能被拥有它的那个线程释放。

c.Semaphore
 semaphore被用来追踪有限的资源。它是 一个核心对象,没有拥有者。可以具名,因此可以被其他进程开启。
可以被任何一个线程释放(released).

d.Event Object
 通常适用于overlapped I/O.或用来设计某些自定义的同步对象。它是一个核心对象,完全在程序的掌控之下,适用于设
计新的同步对象。“要求苏醒”的请求并不会被存储起来,可能会遗失掉。可以具名,因此可以被其他进程开启.

深入理解Win32中的同步机制:临界区、互斥锁和信号量 本文通过代码示例深入探讨了Win32编程中常用的同步机制:临界区、互斥锁和信号量。通过C++实现的类模板mutexLocker以及win32Critical_Section类,展示了如何创建可锁定对象,以及如何确保在多线程环境下对共享资源的安全访问。同时,还介绍了互斥锁的递归特性、信号量的计数机制,以及如何利用它们管理进程间和线程间的同步。 阅读详情

相关推荐

linux和win32下通用的互斥锁Mutex封装

linux和win32下通用的互斥锁Mutex封装,统一接口,可直接使用

CRITICAL_SECTION临界区同一线程和不同线程能不能重入?

编者:李国帅 qq:9611153 微信lgs9611153 时间:2012-6-21 背景: 有些东西需要不停地验证,不停地复习,才能避免忘记,深刻记忆,也会慢慢的深入。 就像临界区,做一次实验竟然不能记住同一线程能不能重入,不同线程能不能重入。 问题描述: 编程中,最容易使用的是临界区,最频繁使用的也是它。 而即便如此,也是容易出错的。多个线程之间频繁的使用,可能用多了会出现搞不清楚临界区是否已经锁定,到底是那个线程锁定了。这里并不讨论这问题。这里验证一个基本原则问题。 通..

lgs7907 1239

ComfyUI的G-Dino模型加载器报错解决方案:从崩溃到重生

遇到G-Dino模型加载器报错不要慌,按照本文的步骤操作,99%的问题都能解决。模型文件正确下载到指定位置segment_anything节点安装完整且无冲突需要补充更多细节或故障排除方法吗?可以随时告诉我。

2301_78150483的博客 4022

Win32多线程之互斥器(Mutexes)

Win32的Mutex用途和critical section非常类似,但是它牺牲速度以增加弹性,或许你已经猜到了。mutex 是MUTual EXclusion的缩写。一个时间内只能够有一个线程拥有mutex,就好像同一时间内只能够有一个线程进入同一个critical section一样。   虽然mutex和critical section做同样的事情,但是它们的运作还是有差别的:   1)

wjj715211的专栏 1494

西门子PLC与汇川SV660P伺服速度模式配置实战指南

本文详细介绍了西门子S7-1200 PLC与汇川SV660P伺服驱动器在速度模式下的配置实战指南。从硬件接线、伺服参数配置到TIA Portal软件组态和PLC程序编写,提供了全面的操作步骤和实用技巧,帮助工程师快速解决伺服系统调试中的常见问题,确保系统稳定运行。

weixin_30316097的博客 498

跨平台烧录实战:RKDevTool在Windows/Linux/MacOS下的统一与差异

本文详细解析了RKDevTool在Windows、Linux和macOS三大操作系统下的固件烧录实践,重点介绍了RK3576开发板的环境配置、工具链选择、烧录模式切换及常见问题解决方案,帮助开发者构建稳定可靠的跨平台烧录工作流。

cnn8visionary的博客 202

Win32多线程 -- 线程同步之互斥器(Mutex)

CRITICAL_SECTION Mutex InitializeCriticalSection() CreateMutex() OpenMutex() EnterCriticalSection() WaitForSingleObject() WaitForMultipleObjects() MsgWaitForMultipleObjects() LeaveCriticalSection() ReleaseMutex() DeleteCriticalSec

cfz751740465的博客 734

行人检测模型在海思平台上的部署:从 PyTorch 到 NNIE 深度优化与实践

摘要 本文详细介绍行人检测模型从PyTorch到海思NNIE平台的部署流程。首先分析了行人检测面临的挑战(尺度变化、遮挡、姿态多样性等)及边缘部署的优势(实时性、隐私保护等)。重点阐述了模型转换过程:PyTorch→ONNX→Caffe→NNIE-WK,其中PyTorch转ONNX需注意评估模式设置、虚拟输入匹配、操作集版本选择等关键点。文章旨在帮助开发者在海思3516D芯片上实现高效的行人检测,克服部署过程中的常见问题,最终实现边缘设备的实时目标检测能力。

FJN110的博客 216

WIN32核心编程 - 线程操作(二) 同步互斥

自动重置事件(Auto Reset Event):当事件被一个等待的线程接收(signaled)后,系统会自动将事件状态重置为非信号状态(non-signaled)。同一时刻下只有一个线程可以拥有互斥体的所有权,如果一个线程拥有了互斥体的所有权,则其他请求该互斥体的线程将会被阻塞,直到互斥体权限释放。如果信号量的值为0,则线程阻塞,直到信号量的值变为大于0。在Windows编程中,事件是一种同步机制,用于在多个线程之间发送信号。共享资源的线程同步机制,临界区在同一进程的线程之间提供了互斥访问。

0xCC说逆向 1426

零基础 ABAP 学习教程系列文章的目录

曾几何时,ABAP 就是 SAP 的代名词。ABAP 这门编程语言造就了 SAP 名噪一时的 R/3 产品,同时也是如今 SAP 旗舰级产品,SAP S/4HANA 底层的实现语言。 ABAP 不仅代表着 SAP 这家公司在企业级管理软件市场辉煌的过去,ABAP 自身也在不断地进化着。SAP 不仅在本地部署(On-Premise)领域继续保持着自己绝对的统治地位,而且在云应用领域(Software-as-a-Service, 简称 SaaS), 也推出了自己的解决方案,比如 SAP S/4HANA Clo

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2万+

深度学习实战103-基于KDD Cup 99数据集的搭建神经网络的检测系统(NIDS),通过对网络流量数据进行分析,提供完整代码

接下来,我们定义一个全连接神经网络模型。return x# 创建数据集和数据加载器# 初始化模型通过以上步骤,我们实现了一个基于PyTorch的简单网络入侵检测系统。这个系统使用KDD Cup 99数据集进行训练和评估。实际应用中,您可以根据需求调整模型结构、超参数以及数据预处理方法。希望对大家有所帮助!如果有任何问题或需要进一步的解释,请随时咨询。

微学AI的博客 1582

Win32 多线程程序设计(4)— 同步控制

2011 年 09 月 05 日 by name5566 Win32 提供了不少同步机制。 Critical Sections(临界区) Critical sections 是 Win32 最容易使用的同步机制。Critical sections 指的是一块用于处理共享资源的代码,如果一个线程已经进入了某个 Critical section,其他线程就不能进入此 Critic

boyhailong的专栏 982

ESP32S3接入讯飞在线语音识别教程及配套源代码

本文介绍了如何使用ESP32-S3开发板实现讯飞在线语音识别功能。首先,需要准备硬件设备,包括ESP32-S3开发板、麦克风模块、MicroSD卡模块和扬声器模块。接着,安装Arduino IDE并配置ESP32-S3开发环境,注册讯飞开放平台账号并获取API凭证。然后,通过I2S接口连接麦克风模块,并编写代码实现语音录制、Base64编码、API请求和识别结果处理。代码包括初始化WiFi、麦克风、系统时间,以及录制语音、发送请求、解析响应等功能。最后,通过按键触发录音,并将识别结果输出到串口。

2401_88800025的博客 746

读书笔记第五周 -《编程高手箴言》

读书笔记第五周   这周看了好几本书的部分,先是跳着看的《编程高手箴言》的前三章,然后看了一点《STL源码剖析》,之后后买了一本《深入理解计算机系统》第三版(又贵了),豆瓣评分9.7,应该是计算机技术方面评分最高的一本书籍了,原以为会偏体系机构,操作系统之类比较底层的东西,没想到后面每一章节居然都是从底层结构讲起,以切实代码的注意细节结束,花的值啊!看的是程序优化一章虽然还没完但是收获颇丰,...

weixin_30533797的博客 171

手把手教你学PCIE-- 热插拔电路设计与实现方案

PCIe热插拔(Hot-Plug)技术允许用户在系统运行时安全地插入或移除设备,而无需重启系统。本文将深入讲解热插拔电路的设计要点、关键器件选型及信号协议规范,涵盖机械结构、电气保护和电源管理三大核心模块。​。

MHD0815的博客 440

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

windows下使用Critical Section和Mutex实现线程同步实例

利用critical section 和 Mutex两种不同的线程同步的方法实现生产者消费者问题。生产者线程要能够对一个计数器进行增的操作,并且将其输出在控制台上,消费者线程能够对这个计数器进行减的操作,并将其输出在控制台上。两种线程都共享一个计数器。 其中增、减计数器的数我设置为1~6随机。测试两种方法的对比,用网上整理出的一张表如下1、使用CriticalSection 方法时,有一个临界区c

sysu_zjl的博客 2041

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Win32多线程学习之一(CriticalSection和Mutex)

最近学习多线程编程,并且以Win32作为实验平台,看了点东西感觉应该稍微有所实践。 因此拿了哲学家进餐问题作了实验品,以来检验最近学习CriticalSection和Mutex的成果 哲学家进餐问题我做了稍微的简化,没有什么左边一个筷子和又边一个筷子。全部简化为总共6根筷子和六个傻冒哲学家,然后大家一起米西米西。 任务目标 1.模拟死锁的发生 2.用CriticalSection...

tinggoxiao的专栏 217

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

用C++实现多线程Mutex锁(Win32)

本文目的:用C++和Windows的互斥对象(Mutex)来实现线程同步锁。     准备知识:1,内核对象互斥体(Mutex)的工作机理,WaitForSingleObject函数的用法,这些可以从MSDN获取详情; 2,当两个或更多线程需要同时访问一个共享资源时,系统需要使用同步机制来确保一次只有一个线程使用该资源。Mutex 是同步基元,它只向一个线程授予对共享资源的独占访问权。如果一个线

Bruce Che 的专栏 3万+

Win32多线程之临界区(Critical Sections)

Win32之中最容易使用的一个同步机制就是 critical sections。所谓critical sections意思是指一小块“用来处理一份呗共享的资源”的程序代码。这里所谓的资源,并不是指.res(资源文件)的Windows资源,而是广义上地指一块内存,一个数据结构,一个文件,或任何其他具有“使用之排他性”的东西。也就是说,“资源”每一次(同一时间内)只能够被一个线程处理。   你可能必

wjj715211的专栏 1656

《Win32多线程程序设计》(4)--- 互斥器(Mutexes)

Win32 的Mutex 用途和critical  section 非常类似,但是它牺牲速度以增加弹性。或许你已经猜到了,mutex 是MU Tual EXclusion 的缩写。一个时间内只能够有一个线程拥有mu tex,就好像同一时间内只能够有一个线程进入同一个critical  section 一样。虽然mu tex 和critical section  做相同的事情,但是它们的运作还是有差

一零一六的博客专栏 1141

WIN32多线程四 线程同步机制Mutex(转)

Mutex与CriticalSection相似,都为了处理多个线程对资源的访问。区别是:mutex是内核对象,锁住mutex需要花费更多的时间,mutex可以跨进程存在。没有任何线程拥有mutex,这个mutex处于未激发状态,线程通过调用WaitForXXX来获得此mutex;除非这个线程ReleaseMutex,否则其他线程都不能获得这个mutex的拥有权。 Mutex可以用来解决哲学家就餐

Lce的专栏 1405

如何在Win32编程中实现多线程同步?

在Win32编程中,多线程同步可以通过多种机制实现,包括临界区、互斥量、信号量和事件。临界区:适用于同一进程内的线程同步。互斥量:适用于跨进程的线程同步。信号量:适用于控制对多个资源的访问。事件:适用于线程间的通信和同步。通过合理选择和使用这些同步机制,可以确保多线程程序的正确性和稳定性。句柄。

weixin_45144862的博客 753

Win32:INI文件读写结构体/Int/String/遍历

INI WritePrivateProfileString GetPrivateProfileInt WritePrivateProfileSection GetPrivateProfileSection GetPrivateProfileSectionNames

L251210269的专栏 1912

win32 - 互斥体 - 防止程序多开

1. 内核级别的临界资源怎么办? 上面的情况是针对 同一个进程 的多个线程访问 临界资源的线程安全问题. 那么多个进程(跨进程也就意味着不同线程) 访问 临界资源 那不简单么? 还是用临界区的线程锁不就行了? 你个hape, 线程锁是针对一个进程里边的多个线程,所以可以在进程申请一个令牌, 实现多个线程问题. 但是现在的问题是 多个进程 (跨进程)访问内核的临界资源. 你在你的进程A里边申请一个令牌, 进程B不能使用啊. 你在你的进程B申请的令牌,进程A不能使用啊. 于是 , 我们把令牌 放到了.

stmlg的博客 1340

mutex和CRITICAL_SECTION

锁的知识我比较贫瘠 临界区我用的更是少之又少,跟互斥量相比1.不能夸进程、2.速度快 =======CRITICAL_SECTION封装类========== //Lock.h #include <Windows.h> class CFastLock { public: CFastLock(); ~ CFastLock(); public: CRITICAL_SECTION m_critical_section; }; class CLock { public

随便写写 271

Windows线程同步API

转载自:http://www.cnblogs.com/devj/archive/2011/10/25/2223856.html 神作,很全面。需要注意的是,部分内容不适合Vista以下版本的操作系统,不过我已经加了注释标志。 本文主要总结创建、结束线程和WIN32 API提供的一些线程同步方法。同步方法包括用户态同步方式:InterLock、CriticalSection、SRWLock和

白永辉的专栏 2145
上一篇: 【Win32多线程】如何避免线程等待浪费CPU时间,降低对系统资源的冲击?
下一篇: 【Win32多线程】如何初始化一个新线程,停止一个执行中的线程,调整线程优先权?
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值