【免杀前置课——Windows编程】十二、线程同步——一文讲懂什么是线程同步、原子操作函数、临界区、互斥体(激发态与非激发态区别)

news2024/11/16 5:29:04

线程同步

  • 线程同步
    • 多线程运行同一操作对象问题
    • 解决方案A:原子操作函数
    • 解决方案B:临界区
    • 解决方案C:互斥体
      • 激发态与非激发态
      • 互斥体优点:

线程同步

多线程运行同一操作对象问题

#include<iostream>
#include<Windows.h>

LONG g_count = 0;
DWORD WINAPI myThreadProc1(
	_In_ LPVOID lpParameter
)
{
	for (size_t i = 0; i < 100000; i++)
	{
		g_count++;
	}
	return 0;
}

DWORD WINAPI myThreadProc2(
	_In_ LPVOID lpParameter
)
{
	for (size_t i = 0; i < 100000; i++)
	{
		g_count++;
	}
	return 0;
}

int main() 
{
	HANDLE hThread1 = CreateThread(0, 0,  myThreadProc1, 0, 0,0);
	HANDLE hThread2 = CreateThread(0, 0,  myThreadProc2, 0, 0,0);
	WaitForSingleObject(hThread1, -1);
	WaitForSingleObject(hThread2, -2);
	printf("%d\n", g_count);
	CloseHandle(hThread1);
	CloseHandle(hThread2);
	return 0;
}

以上是一个双线程同步对g_count进行自增的程序,两次循环都是100000,那么正常结果应该是200000,可运行完后我们会发现,结果并不是这样。只有十万多些,我们查看反汇编。
在这里插入图片描述
我们可以发现一个++操作实现需要多个步骤而线程是并发的,也就是同时进行,但是调用的变量都是一个,所以有可能一个++操作没有执行完就被拉到另一个线程中调用,导致++操作未完整完成,这也就是为什么数据不到200000。
那我们有没有办法解决呢?
用原子操作函数将一个操作多个步骤编程无法分开,即仅我线程完成该操作后才可被其他线程调用

解决方案A:原子操作函数

多个线程访问相同资源的时候会产生冲突
原子操作函数interlockedIncrement ()自增。

解决方案B:临界区

原子操作仅仅能够解决某一个变量的问题,只能使得一个整数型数据做简单数据数据运算的时候是原子的,但是大部分时候我们想要的是一整段代码是原子操作,使用临界区就能解决这个问题
进入临界区
EnterCriticalSection
离开临界区
LeaveCriticalSection
在使用临界区前,需要调用InitializeCriticalSection.初始化一个临界区使用完后需要调用DeleteCriticalSection_销毁。

解决方案C:互斥体

在这里插入图片描述

激发态与非激发态

互斥体有两个状态:激发态、非激发态
它有一个概念,叫做线程拥有权,与临界区类似。
当一个互斥体没有被任何一个线程拥有时,它处于激发态,也可以说锁是打开的。
当一个线程调用了WaitForSingleObject,函数会立刻返回,并将互斥体设置为非激发态,互斥体被锁住,该线程获得拥有权。
其它线程调用WaitForSingleObject函数的线程无法获得拥有权,只能一直等待互斥体,他们全部被阻塞。
当线程A调用ReleaseMutex函数,将互斥体释放,即为解锁,此时互斥体不被任何对象拥有,被设置为激发态,会在等待它的线程中随机选择一个重复前面的步骤。

互斥体优点:

互斥体是内核对象,可以跨进程访问
互斥体比较安全,一旦拥有者崩溃,互斥体会立即处于激发态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/12281.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言工具——Visual Studio 的安装

很多新手朋友们&#xff0c;反应使用 IE 浏览器下载 Visual Studio 下载不下来&#xff0c;此时我们可以在 IE 浏览器上先装一个谷歌浏览器&#xff1a; https://chrom.lkcyl.cn/ . 然后打开谷歌&#xff0c;输入 VS 2019 的下载地址&#xff1a;https://learn.microsoft.com/…

深入浅出带你了解PHAR反序列化

前情提要 为了丰富自己是知识体系&#xff08;为了日更薅羊毛&#xff09;&#xff0c;我最近频繁翻阅MDN的文档&#xff0c;果然MDN文档常看常新。 最近翻到CSS部分&#xff0c;然后打开了伪类这一栏&#xff0c;好家伙&#xff0c;快60个了&#xff08;包括实验中的&#x…

【EC200U】 SIM卡使用

EC200U SIM卡SIM卡是什么SIM卡分类Quecpython SIM库调用获取sim卡的状态获取IMSI获取ICCID运行测试我们物联网要用到SIM卡&#xff0c;这张卡是4G应用的基础&#xff0c;许多功能都需要用到SIM卡。买此类板子别忘了买SIM卡哦。 SIM卡是什么 SIM卡是(Subscriber Identity Modul…

影刀连接Mysql数据库

这里写自定义目录标题官方教程下载安装Mysql-connector配置数据源填写影刀的配置的向导官方教程 官方影刀下载mysql连接教程 https://www.winrobot360.com/yddoc/language/zh-cn/%E6%8C%87%E4%BB%A4%E6%96%87%E6%A1%A3/%E5%85%B6%E4%BB%96/%E6%95%B0%E6%8D%AE%E5%BA%93/%E8%BF…

初步探索GraalVM--云原生时代JVM黑科技

1 云原生时代Java语言的困境 经过多年的演进&#xff0c;Java语言的功能和性能都在不断的发展和提高&#xff0c;诸如即时编译器、垃圾回收器等系统都能体现Java语言的优秀&#xff0c;但是想要享受这些功能带来的提升都需要一段时间的运行来达到最佳性能&#xff0c;总的来说…

linux笔记(5):按照东山派的官方教程编译buildroot(东山哪吒,D1-H)踩坑记录

文章目录1.编译流程1.1获取sdk源码1.2 补充&#xff1a;下载riscv64-glibc-gcc-thead_20200702.tar.xz1.3 补充&#xff1a;安装mtool工具1.4 安装必要依赖包1.5 编译sdcard 最小系统镜像1.6 烧录最小镜像系统到tf(SD)卡1.6.1 安装烧录工具1.6.2 格式化SD卡1.6.3 烧录镜像到sd卡…

杂篇(一)

开篇词 我本是红尘一俗客&#xff0c;没有那文人酸腐气。 曾几何时&#xff0c;梳理收藏夹&#xff0c;发现了很久前收藏的一位前端大佬的个人博客&#xff1a;怡红院落 &#xff0c;因为领域不同&#xff0c;之前一直没有拜读过他的文章。 我尚且无法判断怡红公子购买的域名…

【Log日志】springboot项目中集成Log日志详解

springboot项目中集成Log日志详解一、Log日志介绍1.Log 日志组件主要作用及用途2.日志的级别Level级别控制3.日志的输出Import3.1 快速使用3.2 日志文件输出3.3 自定义配置4. Spring Boot 日志组件 Log Plugin二、Spring Boot Logback1.依赖配置 Pom.xml2.使用 YML 配置 logbac…

Linux操作系统~系统文件IO,什么是文件描述符fd?什么是vfs虚拟文件系统

目录 1.open() &#xff08;1&#xff09;.第二个参数flags—通过比特位传多组标记 2.文件描述符fd&#xff08;open函数的返回值&#xff09; &#xff08;1&#xff09;.fd的本质 &#xff08;2&#xff09;.vfs-虚拟文件系统&#xff08;一切皆文件&#xff09; &…

MySQL Binlog 简介

MySQL Binlog Binlog 记录了所有的 DDL 和 DML(除了数据查询语句)语句&#xff0c;以事件形式记录&#xff0c;还包含语句所执行的消耗的时间&#xff0c;MySQL 的二进制日志是事务安全型的。 一般来说开启二进制日志大概会有 1%的性能损耗。 二进制日志包括两类文件&#xf…

seccon 2022 quals -simplemod

文章目录题外话调试思路如何找到对应的link_map分析do_lookup_x我的构造payloadall_exp总结题外话 这个题应该是seccon解题数量最少的了 这个题目其实和babyfile差不多&#xff0c;都是考虑0 lick,整体而言通过这两个题可以感受到出题者对于IO以及dl_resolv的理解深入 这个题目…

阻止移动端 touchmove 与 scroll 事件冲突

在移动端开发过程中&#xff0c;如果要实现一个元素或按钮的拖动定位&#xff0c;会出现很多坑。例如&#xff1a;元素上下移动过程中&#xff0c;会触发 body 的 scroll 事件&#xff0c;导致整体的位置偏移&#xff0c;这时就需要 阻止移动端 touchmove 与 scroll 事件冲突 。…

confluent-kafka-go依赖库编译体验优化

文章目录问题描述&#xff1a;解决方案1&#xff1a;编写Dockerfile文件2&#xff1a;运行Docker镜像3&#xff1a;进入镜像进行编译4&#xff1a;将编译成功的二进制文件复制到本机参考地址问题描述&#xff1a; ​ 在项目中使用了go的kafka库confluent-kafka-go&#xff0c;…

力扣(LeetCode)2. 两数相加(C++\C)

模拟 模拟加法运算&#xff0c;设置进位数 ttt &#xff0c; t(l1t(l1t(l1->vall2vall2vall2->valt)%10valt)\%10valt)%10 即为当前位上的数&#xff0c; t/10t/10t/10 即是进位数。 设置哑结点&#xff0c;便于操作头结点。 模拟上述操作&#xff0c;最后返回哑结点的…

Windows11更新最新系统版本后无法播放媒体声音

故障机器Dell为例 step1&#xff1a;检测系统提示音是否正常&#xff0c;正常可观察第二步&#xff1b; step2:打开计算机管理-设备管理器-观察声音设备是否正常&#xff0c;可右键编辑重启驱动 step3&#xff1a;打开无法播放媒体声音的设备查看设置&#xff0c;Firefox为例 …

腾讯魏巍:Eunomia云原生资源编排优化

2022年11月10日&#xff0c;在中国信通院、腾讯云、FinOps产业标准工作组联合发起的《原动力x云原生正发声 降本增效大讲堂》系列直播活动第10讲上&#xff0c;腾讯Light云计算平台负责人魏巍分享了Eunomia云原生资源编排优化实践。本文整理自魏巍的分享。 云上资源优化背景 相…

为你的服务器集成 LDAP 认证

本文内容 为什么需要 LDAP 认证如何集成 LDAP 认证Nginx 篇Apache 篇Backend 篇本文小结回顾我这些年的工作经历,面向企业(2B)和面向用户(2C)的项目都曾接触过。我个人觉得,面向企业的项目更注重业务,参与决策的人数多、周期长,目的是为企业提供生产经营价值,如缩减成本、…

kotlin coroutine源码解析之suspend挂起函数原理

目录suspend挂起函数join原理Await原理Suspend函数总结suspend挂起函数 在idea中写某些协程函数的时候&#xff0c;会有一个绿色箭头图标的出现&#xff0c;如下图&#xff1a; 而且这些方法不放在协程里面写的话&#xff0c;idea编辑器还会报错&#xff0c;如下图&#xff1…

基于python的人力资源管理系统

摘 要 随着当今社会的发展&#xff0c;时代的进步&#xff0c;各行各业也在发生着变化&#xff0c;比如人力资源管理这一方面&#xff0c;利用网络已经逐步进入人们的生活。传统的人力资源管理&#xff0c;都是员工去公司查看部门信息、招聘信息&#xff0c;这种传统方式局限性…

第一个 Go 程序,从 Hello World 开始

1、开发编辑器 Go 采用的是UTF-8编码的文本文件存放源代码&#xff0c;理论上使用任何一款文本编辑器都可以做 Go 语言开发&#xff0c;这里推荐使用 VS Code 和 Goland。 VS Code 是微软开源的编辑器&#xff0c;而 Goland 是 jetbrains 出品的付费IDE。GoLand 开发工具时收…