Windows下C++多线程同步与互斥简单运用

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

继以往的想法,写这点文字,粘贴点代码,是为了增加自己的记忆,也希望能帮助到需要帮助的人。

 

1.  互斥量,Mutex

 

几个注意的地方:

(1)互斥量为内核对象,能够与其他线程或特殊事件取得同步;

(2)速度比临界区要慢;

(3)互斥量对象与所有其它内核对象的不同之处在于它是被线程所拥有的,互斥量对象除了记录当前信号状态外,还要记住此时那个线程拥有它。

(4)这个常来被运用于限制程序启动次数!

 

 

2.事件 Event

 

 

几个注意的地方:

(1).和Mutex使用差不多,只有细微的差别;

(2).可以使用SetEvent或ResetEvent改变其状态;

(3).在应用程序中任意一处没有正确的按照规则调用SetEvent或ResetEvent,将达不到同步或互斥的目的;

(4).一般来说,都是利用Event来进行同步,而不是我们这里的让它来达到互斥;

(5).Event处于无信号状态时,相关线程或进程退出,系统并不会尝试将其置为有信号状态;

 

3.临界区 CRITICAL_SECTION

 

 

几个注意的地方:

(1).比Mutex速度快;

(2).临界区在线程内的分配必须是全局的;

(3). 临界区一次只允许一个线程访问;

 

 

4.信号量Semaphore

    首先说说那些关于信号量那些不得不让人伤心的事情,因为笔者大学不好学习,非常调皮,而信号量又是老师最讨论及考试的话题之一,所以我觉得这个东西非常扯淡,非常影响情绪,于是放在最后。------以上是为题外话。

    为什么大学老师总是喜欢信号量呢?

    因为这是一个生产者-消费者模型,并且很多计算机问题都可以看做是生产者-消费者的问题,是同步最易理解的模型。

    关于理论上的知识,我就不说了,书里面很多的。

    还有我不是很想实现生产者-消费者的模型,就用其他例子代替了。这个有点不负责任。

 

 

几个注意的地方:

信号量内核对象对线程的同步方式与前面几种不同,它允许多个线程在同一时刻访问某一资源,但是需要限制同一时刻访问此资源的最大线程数目。

 

 

总结: 线程规模 = CPU * 2 + 1

 

代码通过VS2005编译,运行成功,如有什么疑问,请各位看官大方赐教。

windows进程同步信号量(semaphore) windows下进程同步方式之一的信号量对象主要包含如下三个部分: 计数:标记使用该信号量的线程数 最大资源数据:信号量控制的最大资源的数目 可用资源数目:信号量当前可用的资源数目 可用资源数目如果大于0,表示信号量已被触发,如果等于0表示信号量未触发 函数接口 1. 创建信号量 CreateSemaphore() HANDLE WINAPI CreateSemaphore( _In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes... 阅读详情

相关推荐

C++多线程同步之Mutex(互斥量)

一、互斥量Mutex同步多线程1、Win32平台相关函数和头文件#include <windows.h> HANDLE CreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全属性的指针 BOOLbInitialOwner, // 初始化互斥对象的所有者 LPCTSTRlpName // 指向互斥对象名的指针 );DWORD WINAP

~探路者~的博客 7670

深入理解和实现Windows进程间通信(信号量

信号量(Semaphore)是一个非常重要的同步机制,用于控制多个线程或进程对共享资源的访问。其基本思想是使用一个整数变量来表示可用资源的数量,通过对这个整数的操作来控制资源的分配,从而实现对竞态条件的管理。信号量的操作是原子的,即在一个操作进行的过程中,不会被其他进程或线程中断。功能:创建或打开一个命名或无名的信号量对象。声明参数lpSemaphoreAttributes:指向一个结构,该结构决定返回的句柄是否可以被子进程继承。如果为NULL,则句柄不可继承。

LeoLei8060的博客 3296

【Java并发编程】synchronized(四):信号量互斥量原理分析对比

1 临界区 1.1 简介 在早期计算机系统中,只有一个任务进程在执行,并不存在资源的共享竞争。随着技术和需求的飞速发展,单个CPU通过时间分片在一段时间内同时处理多个任务进程,当多个进程对共享资源进行并发访问,就引起了进程间的竞态。这其中包括了我们所熟知的SMP(对称多处理器结构)系统,多核间的相互竞争,单CPU中断和进程间的相互抢占等诸多问题。 更具体的说,对某段代码而言,可能会在程序中多次被执行(多线程便是典型的场景),每次执行的过程我们称作代码的执行路径,当两个或多个代码路径要竞争共同的资源的时候,

A minor 1985

线程的互斥同步(5)- Windows信号量Semaphore

信号量也是进程间同步常用的手段之一。举个例子,比如我们要去餐馆吃饭,这家餐馆一共有4个位置,我们一共是6个人。那么就会4个人先去吃饭,等他们吃完了,剩下的2个人再去吃饭,如果再来人则需要判断是否有空位置,如果有直接坐下吃饭,如果没有则需要等待。 这里的每一个顾客就相当于一个线程,而通知你排队叫号进餐的那个服务员就是我们的信号量信号量可以有效的保证我们多个线程并发执行。 对于信号量,我们经常使用的...

不会飞的纸飞机的博客 1302

window下线程同步之(Semaphores(信号量))

HANDLE WINAPI CreateSemaphore( _In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes _In_ LONG lInitialCount, _In_ LONG lMaximumCount, _In_opt_ LPCTSTR lpName ); ...

dclutwoku16741537的博客 589

(转)WindowsC++多线程同步互斥简单运用

1.互斥量,Mutex [cpp]view plaincopy #include<Windows.h> #include<iostream> usingnamespacestd; DWORDWINAPIThread1(LPVOIDlpParmeter); DWORDWINAPIThread2...

weixin_33953384的博客 131

WindowsC++多线程同步互斥简单运用-转

1.  互斥量,Mutex [cpp] view plaincopy #include    #include    using namespace std;   DWORD WINAPI Thread1(LPVOID lpParmeter);   DWORD WINAPI Thread2(LPVOID lpParmeter);   static HAND

xp5xp6的博客 343

Windows C++ 内核对象 多线程 线程同步 互斥对象

1.在windows中子进程和主进程是一起走的,在没有设置的情况下。2.主进程是不会等待子进程的结束后才继续的。1.WaitForSingleObject() 函数会等待一个内核对象的变为已通知状态(结束的时候 就是已通知状态)。2.dwMilliseconds=INFINITE 就是无限期等待3.hHandle是哪个内核对象的Handle。1.用了互斥对象后 我们在子线程的代码中 加入WaitForSingleObject(hMutex, INFINITE);

qq_52528309的博客 1038

c++ 多线程向同一个文本写入信息 解决同步互斥问题

c++ 多线程向同一个文本写入信息 解决同步互斥问题 作业:使用四个线程向一个文本内写入不同的内容,要求解决同步互斥的问题。 目录 Windows多线程结构 Windows互斥锁解决同步问题 代码 Windows多线程结构: HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD:线程安全相关的属性,常置为NULL SIZE_T dwStackSize,//initialstacksize:新线程的初始化

TKXS 1848

C++多线程同步

线程间的同步方法大体可以分为两类:用户模式和内核模式。内核模式就是指利用系统内核对象的单一性来进行同步,使用时需要切换内核态用户态,而用户模式就是不需要切换到内核态,只在用户态完成操作。 用户模式下的方法有:原子操作(例如一个单一的全局变量)、临界区。特点是:同步速度特别快。 内核模式下的方法有:事件、信号量互斥量。同步速度较慢,但适用性比较好。 **临界区:**通过对多线程的串行化来访问公共资源或一段代码、速度快,适合控制数据访问。 **互斥量:**为协调共同对一个共享资源的单独访问而设计的。 *

目标:MVP 7617

多线程冲突了怎么办?(多线程同步互斥问题)

在单核CPU系统⾥,为了实现多个程序同时运⾏的假象,操作系统通常以时间⽚调度的⽅式,让每个进程执⾏每次执⾏⼀个时间⽚,时间⽚⽤完了,就切换下⼀个进程运⾏,由于这个时间⽚的时间很短,于是就造成了「并发」的现象。另外,操作系统也为每个进程创建巨⼤、私有的虚拟内存的假象,这种地址空间的抽象让每个程序好像拥 有⾃⼰的内存,⽽实际上操作系统在背后秘密地让多个地址空间「复⽤」物理内存或者磁盘。如果⼀个程序只有⼀个执⾏流程,也代表它是单线程的。

m0_74229735的博客 1547

C++多线程同步之临界区(CriticalSection)、WINDOWS和LINUX

一、Win32平台 1、相关头文件和接口 #include &lt;windows.h&gt; CRITICAL_SECTION cs;//定义临界区对象 InitializeCriticalSection(&amp;cs);//初始化临界区 EnterCriticalSection(&amp;cs);//进入临界区 LeaveCriticalSection(&amp;cs);//离开临界...

蜜汁程序员的博客 3224

Windows多线程编程 互斥量和临界区使用

Windows 多线程互斥量和临界区

weixin_42462436的博客 1515

【操作系统】同步互斥Golang互斥锁实现

使用临界区的思想,问题就可以较好的解决。有了临界区的代码之后,就可以确保任何时候只有一个对象在临界区中执行,其他对象在外面等待,知道临界区中的对象离开,其他进程中的一个会进入临界区去执行。执行这种可屏蔽中断的指令,只是把自身的响应中断的能力屏蔽了,并不意味着也将其他cpu的响应中断能力屏蔽,所以其实其他的cpu还是可以继续产生中断,所以在多cpu的情况下是无法解决互斥问题的。有些看上去是原子操作,实际不是,连x++这样简单的语句,实际上是由3条指令造成的,有时候甚至连条单条机器指令都不是原子的。

catkin_ws的博客 1880

【效率对比】c++多线程同步几种方式的效率对比研究: 原子操作,c++锁,自旋锁,windows临界区,windows互斥对象

通过比较以下几种同步方式,测试各方法效率,分为以下6种情况做对比: 不加任何同步措施; Windows原子操作; c++11 mutrex; 自定义的自旋锁CLCS; Windows临界区; Windows互斥对象; 硬件平台:AMD 8核16线程,内存16GB 系统/软件平台:windows10,vs2019com(vc++); 方法:定义3个变量,在多线程中自加(16线程x10万次),记录...

carlclouder的博客 3434
上一篇: 关于MFC中CMemoryState的一些使用
下一篇: 用CreateFile打开COM10以上的串口
ccing
博客等级 码龄19年 11粉丝 9原创
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值