![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 88
分析多线程源码,锁源码,讲解多线程常用模型和应用场景。
园中猪吃菜
关注网络、数据、驱动和桌面UI开发
展开
-
多线程误区之:多线程处理I/O效率更快
当I/O线程处理好这个事件,会先判断一下这个事件是否包含回调函数,如果有,就调用回调函数(这就是异步I/O的实现),如果没有回调函数,那么这个事件就会有一个Event对象,I/O线程会调用SetEvent(这就是同步I/O的实现),SetEvent以后,应用层线程就会被唤醒,然后知道读/写事件处理完成,读/写函数返回。寻道机制,就是说机械硬盘有一个磁头,你要读或写磁盘的某个地方时,磁盘会先将磁头定位到磁片正确的位置,然后才开始读写,就是这个磁头定位的过程,就叫寻道,是非常耗时的。原创 2024-06-07 22:50:08 · 610 阅读 · 0 评论 -
多线程锁详解之【互斥量】
更多的锁介绍可以先看看这篇文章:多线程锁详解之【序章】正文:互斥量,一个应用起来跟临界区十分相似的锁,但互斥量是可以命名的,可以跨进程使用,而临界区只能在单个进程内使用,效率方面互斥量往往也比临界区要低,这是什么原因导致的呢?让我们先来学习一遍互斥锁的源码,再讨论上面提出的问题。源码:先来看看互斥锁是如何创建的:如果你已经看过了事件对象的创建过程,就会发现互斥锁创建的过程是如此的熟悉。这里我们不过多赘述这个函数的流程是做了写什么了,都是一些三板斧动作。主要是讲述一些与其他锁对象不同的地方。首先是函数名原创 2022-07-06 15:22:31 · 455 阅读 · 0 评论 -
多线程锁详解之【信号量】
如果你有事件对象(Event)的作为基础,那么信号量理解起来将会十分容易。信号量,又名信号灯,是用来限定进入代码区域的次数。大家知道,如果事件对象带有信号自动重置的标记,那么即时事件对象处于有信号的状态下, WaitForSingleObject 函数也只能通过一次,想再次通过 WaitForSingleObject 就必须再次调用 SetEvent 函数。如果事件对象附带的是手动重置信号标记,那么在事件对象有信号的状态下, WaitForSingleObject 函数则可以无限次通过,除非调用 Rese原创 2022-07-03 19:06:29 · 362 阅读 · 0 评论 -
多线程锁详解之【条件变量】
注:本文以windows临界区作为案例说明,其实各个操作系统中的临界锁的理论是相通的,源码逻辑也是大同小异,其中 linux 系统的 mutex 锁原理与逻辑可以说与windows临界区是一样的。其次是很多开发者对锁的理解只局限于调用,如果需要他们自己实现一个锁,往往无能为力。比如XP系统没有条件变量和读写锁,当应用中需要的时候如何实现?还有如何模仿数据库中的表锁,行锁,网络锁,乐观锁等等。。。理解临界区的底层原理与逻辑,是实现这些锁的第一条件!正文开始先来回顾一下windows 临界区的几个函数:原创 2022-06-28 20:45:51 · 435 阅读 · 0 评论 -
多线程锁详解之【临界区】
正文:一般锁的类型可分为两种:用户态锁和内核态锁。用户态锁是指这个锁的代码只依赖于用户态,不会陷入内核态执行。而内核态锁很明显就是哪些会陷入内核态执行的锁。一般书中会说,windows 提供了两个用户态锁,一个是原子操作,而另外一个,正是我们要讨论的主题:临界区。原理:临界区作为用户态最常用的锁,它的使用方法并不复杂,就是拥有初始化和反初始化函数,一对 lock 和 unlock 函数,当然还有一个不太常用的 trylock 函数。如下:(1)初始化临界区 InitializeCriticalSecti原创 2022-06-24 11:24:57 · 1650 阅读 · 0 评论 -
多线程锁详解之【WaitForSingleObject】
WaitForSingleObject原创 2022-06-04 19:49:15 · 2878 阅读 · 0 评论 -
多线程锁详解之【事件对象】
更多的锁介绍可以先看看这篇文章: 多线程锁详解之【序章】正文:信号量,又名事件锁或者事件,是一个内核锁,可用于跨进程等待。先看看事件锁的头文件定义:对内核有了解的同学都知道,一般应用层的内核函数,下层都会调用对应的【Nt!XXX】函数,那我们再来看看NtCreateEvent源码上面的代码,在不考虑安全性和出错的情况下,我们可以简化为下面这样。.................................原创 2022-06-03 18:34:50 · 422 阅读 · 0 评论 -
多线程锁详解之【原子操作】
原子操作,顾名思义它的操作具有原子性。所谓原子性就是指动作不可分割且独占数据读写。什么是操作不可分割?我们知道系统的线程数总是大于CPU数,系统其实是把这些线程对象放到了一个队列里面,然后轮流把这些线程对象放到CPU核心上,执行对象一部分的代码,周而复始,直至所有的线程代码执行完毕。由于CPU计算速度极快,肉眼上是看不出线程的轮流执行的,但事实上每一个线程对象,确实是轮流地,断断续续地执行,不是连续的。而线程对象这种断断续续执行的特性,我们称之为线程对象的动作是可分割。既然原子性动作不可分割,那就说明原原创 2022-06-02 20:03:43 · 994 阅读 · 0 评论 -
多线程之锁详解之【序章】
在日常多线程开发中,大家应该碰到过各种形形式式的锁,比如原子变量,事件对象(Event),临界区,互斥量(Mutex)等等。大家有没有好奇过,这些锁的底层是如何实现的呢?比如在XP系统中没有条件变量和读写锁这两个锁,当我们需要在XP系统下自行实现这两个锁的时候,该怎么办?想实现上述两个锁,大家首先需要的入门知识是:CPU缓存行锁与系统中断锁的原理。CPU缓存行锁与系统中断锁这两个锁可能很多人闻所未闻,这里需要告诉大家的是:主流的操作系统中,真正的锁只有这两个!而你们所看到的什么条件变量,临界区,互斥量等原创 2022-06-02 14:59:08 · 250 阅读 · 0 评论 -
多线程入门常识
关于多线程,很多刚接触的同学,总是理解不够,或者理解有误,这里我们分享一下多线程的入门常识。常识一:什么是响应,效率,性能。响应指的是某个函数的完成时间,假设界面上有一个按钮,点击按钮后悔创建一个新的线程去执行备份操作:DWORD WINAPI DoBackup(LPVOID pParam) { //备份操作,需要10秒 ::Sleep(10 * 1000);}void OnButton() //点击按钮回调{ //1毫秒 CreateThread(NULL,原创 2022-05-30 01:44:17 · 862 阅读 · 0 评论 -
相对定时器实现详解
对定时器概念不是特别熟悉的同学可以先看看 定时器概述 这篇文章。地址: https://blog.csdn.net/qq492927689/article/details/123262563下面我们从代码层面上,讲解一下相对定时器如何实现。先上代码:main.cpp:#include "Timer.h"void TimerOut(TIMER* pTimer, void* pParam) { printf("TimerOut = %s\n", (char*)pParam);}void原创 2022-05-26 21:31:53 · 304 阅读 · 0 评论 -
多线程之线程池设计
代码下载地址:https://gitee.com/dai-jiapei/iocp/tree/master/Thread主要下载 demo.c ,threadpool.c, threadpool.h 三个文件即可这个一个跨系统线程池,支持Linux, windows。其中包含XP,需要将threadpool.c::COMPATIBLE_XP 这个宏定义为 1。XP 需要宏控制是因为XP没有条件变量,只能自己实现一个,当 COMPATIBLE_XP 为0时, 使用系统提供的条件变量函数。线程池这东西,原创 2022-05-16 21:48:31 · 583 阅读 · 0 评论 -
定时器概述
在日常的开发工作中,我们总是或多或少地接触到各式各样样的定时器,一般我个人喜欢将定时器划分为三类:频率定时器相对/绝对定时器异步定时器首先说一下最简单的,频率定时器。其实就是设置一个频率的值。然后其所在定时器相信大家都不陌生,在日常的网络编程,窗口编程,都会接触到 SetTimer 这一类函数。那么定时器到底是怎么实现的呢?首先我们以WIN32的定时器为列子,看看定时器函数的定义。UINT_PTR SetTimer(HWND hWnd, // 窗口句柄UINT_PTR nIDEvent原创 2022-03-03 20:38:12 · 1500 阅读 · 0 评论 -
_beginthread 与 _endthread 函数分析 (ReactOS版)
多线程常用函数CreateThread - 创建线程ExitThread - 退出线程TerminateThread - 终结线程SuspendThread - 挂起线程ResumeThread - 唤醒线程GetExitCodeThread - 取得线程返回值WaitForSingleObject - 可用来等待线程原创 2021-08-25 23:41:10 · 1131 阅读 · 0 评论