为什么Mutex,Event,Thread句柄都是可以waitforsingleobject?

从论文到生产:iSLIP优先级匹配算法在SDN交换机中的20年演进史 本文回顾了iSLIP优先级匹配算法在SDN交换机中的20年演进历程,从斯坦福大学的原始论文到现代芯片实现。通过独特的指针滑动和迭代循环机制,iSLIP算法显著提升了交换机的吞吐量和公平性,解决了传统FIFO调度的队头阻塞问题。文章详细探讨了算法在硬件实现中的工程挑战、开源实践及未来AI时代的智能调度方向。 阅读详情

原因比较简单,他们都是有个DISPATCHER_HEADER Header;的头部,EVENT只有这个头部(定义可以在DDK里面看到)

typedef struct _KTHREAD {

    //
    // The dispatcher header and mutant listhead are fairly infrequently
    // referenced, but pad the thread to a 32-byte boundary (assumption
    // that pool allocation is in units of 32-bytes).
    //

    DISPATCHER_HEADER Header;
    LIST_ENTRY MutantListHead;

    //
    // The following fields are referenced during trap, interrupts, or
    // context switches.
    //
    // N.B. The Teb address and TlsArray are loaded as a quadword quantity
    //      on MIPS and therefore must be on a quadword boundary.
    //

    PVOID InitialStack;
    PVOID StackLimit;
#if defined(_IA64_)
    PVOID InitialBStore;
    PVOID BStoreLimit;
#endif
    PVOID Teb;
    PVOID TlsArray;
    PVOID KernelStack;
#if defined(_IA64_)
    PVOID KernelBStore;
#endif
    BOOLEAN DebugActive;
    UCHAR State;
    BOOLEAN Alerted[MaximumMode];
    UCHAR Iopl;
    UCHAR NpxState;
    CHAR Saturation;
    SCHAR Priority;
    KAPC_STATE ApcState;
    ULONG ContextSwitches;

    //
    // The following fields are referenced during wait operations.
    //

    LONG_PTR WaitStatus;
    KIRQL WaitIrql;
    KPROCESSOR_MODE WaitMode;
    BOOLEAN WaitNext;
    UCHAR WaitReason;
    PRKWAIT_BLOCK WaitBlockList;
    LIST_ENTRY WaitListEntry;
    ULONG WaitTime;
    SCHAR BasePriority;
    UCHAR DecrementCount;
    SCHAR PriorityDecrement;
    SCHAR Quantum;
    KWAIT_BLOCK WaitBlock[THREAD_WAIT_OBJECTS + 1];
    PVOID LegoData;
    ULONG KernelApcDisable;
    KAFFINITY UserAffinity;
    BOOLEAN SystemAffinityActive;
    UCHAR PowerState;
    UCHAR NpxIrql;
    UCHAR Pad[1];
    PVOID ServiceTable;
//    struct _ECHANNEL *Channel;
//    PVOID Section;
//    PCHANNEL_MESSAGE SystemView;
//    PCHANNEL_MESSAGE ThreadView;

    //
    // The following fields are referenced during queue operations.
    //

    PRKQUEUE Queue;
    KSPIN_LOCK ApcQueueLock;
    KTIMER Timer;
    LIST_ENTRY QueueListEntry;

    //
    // The following fields are referenced during read and find ready
    // thread.
    //

    KAFFINITY Affinity;
    BOOLEAN Preempted;
    BOOLEAN ProcessReadyQueue;
    BOOLEAN KernelStackResident;
    UCHAR NextProcessor;

    //
    // The following fields are referenced during system calls.
    //

    PVOID CallbackStack;
#if defined(_IA64_)
    PVOID CallbackBStore;
#endif
    PVOID Win32Thread;
    PKTRAP_FRAME TrapFrame;
    PKAPC_STATE ApcStatePointer[2];
    CCHAR PreviousMode;
    UCHAR EnableStackSwap;
    UCHAR LargeStack;
    UCHAR ResourceIndex;

    //
    // The following entries are referenced during clock interrupts.
    //

    ULONG KernelTime;
    ULONG UserTime;

    //
    // The following fields are referenced during APC queuing and process
    // attach/detach.
    //

    KAPC_STATE SavedApcState;
    BOOLEAN Alertable;
    UCHAR ApcStateIndex;
    BOOLEAN ApcQueueable;
    BOOLEAN AutoAlignment;

    //
    // The following fields are referenced when the thread is initialized
    // and very infrequently thereafter.
    //

    PVOID StackBase;
    KAPC SuspendApc;
    KSEMAPHORE SuspendSemaphore;
    LIST_ENTRY ThreadListEntry;

    //
    // N.B. The below four UCHARs share the same DWORD and are modified
    //      by other threads. Therefore, they must ALWAYS be modified
    //      under the dispatcher lock to prevent granularity problems
    //      on Alpha machines.
    //

    CCHAR FreezeCount;
    CCHAR SuspendCount;
    UCHAR IdealProcessor;
    UCHAR DisableBoost;

} KTHREAD, *PKTHREAD, *RESTRICTED_POINTER PRKTHREAD;

//
// Process object structure definition
//

typedef struct _KPROCESS {

    //
    // The dispatch header and profile listhead are fairly infrequently
    // referenced, but pad the process to a 32-byte boundary (assumption
    // that pool block allocation is in units of 32-bytes).
    //

    DISPATCHER_HEADER Header;
    LIST_ENTRY ProfileListHead;

    //
    // The following fields are referenced during context switches.
    //

    ULONG_PTR DirectoryTableBase[2];

#if defined(_X86_)

    KGDTENTRY LdtDescriptor;
    KIDTENTRY Int21Descriptor;
    USHORT IopmOffset;
    UCHAR Iopl;
    BOOLEAN VdmFlag;

#endif

#if defined(_IA64_)

    KGDTENTRY LdtDescriptor;
    ULONGLONG UnscrambledLdtDescriptor;
    KIDTENTRY Int21Descriptor;
    BOOLEAN VdmFlag;

    REGION_MAP_INFO ProcessRegion;
    REGION_MAP_INFO SessionRegion;
    PREGION_MAP_INFO SessionMapInfo;
    ULONG_PTR SessionParentBase;

#endif // _IA64_

#if defined(_ALPHA_)

    union {
        struct {
            KAFFINITY ActiveProcessors;
            KAFFINITY RunOnProcessors;
        };

        ULONGLONG Alignment;
    };

    ULONGLONG ProcessSequence;
    ULONG ProcessAsn;

#else

    KAFFINITY ActiveProcessors;

#endif

    //
    // The following fields are referenced during clock interrupts.
    //

    ULONG KernelTime;
    ULONG UserTime;

    //
    // The following fields are referenced infrequently.
    //

    LIST_ENTRY ReadyListHead;
    LIST_ENTRY SwapListEntry;
    LIST_ENTRY ThreadListHead;
    KSPIN_LOCK ProcessLock;
    KAFFINITY Affinity;
    USHORT StackCount;
    SCHAR BasePriority;
    SCHAR ThreadQuantum;
    BOOLEAN AutoAlignment;
    UCHAR State;
    UCHAR ThreadSeed;
    BOOLEAN DisableBoost;
    UCHAR PowerState;
    BOOLEAN DisableQuantum;
    UCHAR Spare[2];
} KPROCESS, *PKPROCESS, *RESTRICTED_POINTER PRKPROCESS;

STM32+HX711实战:5分钟搞定拉力传感器数据采集(附完整代码) 本文详细介绍了如何使用STM32微控制器和HX711模数转换器快速搭建高精度拉力测量系统。通过硬件连接指南、驱动实现代码和校准方法,帮助开发者在5分钟内完成拉力传感器数据采集,适用于工业自动化和消费电子等场景。 阅读详情

相关推荐

7-1 链式基数排序 (20 分)

7-1 链式基数排序 (20 分) 实现链式基数排序,待排序关键字n满足1≤n≤1000,最大关键字数位≤5。 输入样例: 第一行输入待排序个数n(1≤n≤1000),再输入n个数(n的数位≤5)。 10 278 109 63 930 589 184 505 269 8 83 输出样例: 输出每趟分配-收集后链表中的关键字,趟数为序列中最大值的数位(如样例中930的数位为3),每行结尾有空格。 930 63 83 184 505 278 8 109 589 269 505 8 109 930 63 26

OwemShu的博客 4236

杰理之互斥锁(Mutex)【篇】

初始化互斥锁 函数 int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); 描述 初始化互斥锁 参数 mutex: 互斥锁句柄 attr: 指向互斥锁属性的指针,若该指针NULL,则使用默认的属性。 返回值 0:成功 其他:失败 互斥锁上锁 函数 int pthread_mutex_lock(pthread_mutex_t *mutex); 描述 阻塞方式给互斥锁上锁 ,如果互斥锁mutex被其他线程上

u013820168的博客 418

Ubuntu20.04 高效安装企业微信的完整指南

本文提供了在Ubuntu20.04系统上高效安装企业微信的完整指南,详细介绍了通过Deepin-wine环境运行Windows版企业微信的步骤和优化技巧。内容包括系统环境检查、依赖安装、企业微信包的获取与安装、首次运行配置及常见问题解决方案,帮助开发者在Ubuntu系统中流畅使用企业微信进行办公通讯。

weixin_42568801的博客 351

什么是句柄?为什么会有句柄?HANDLE

转载:[url]http://www.cppblog.com/mymsdn/archive/2009/02/19/74221.aspx[/url] 关键字:句柄, HANDLE, WINDOWS SDK, windows.h, 从广义上,能够从一个数值拎起一大堆数据的东西都可以叫做句柄。句柄的英文是"Handle",本义就是"柄",只是在计算机科学中,被特别地翻译成"句...

weixin_34221112的博客 3201

微信本地数据解密实战:从AES加密原理到EnMicroMsg.db恢复指南

数据加密是保障信息安全的核心技术,其中对称加密算法AES因其高效可靠,被广泛应用于各类本地数据保护场景。其原理是通过特定密钥对数据进行混淆转换,确保未经授权者无法读取原始内容。在移动应用领域,本地数据库加密对于保护用户隐私、防止数据泄露具有重要价值。微信作为国民级应用,对其本地存储的聊天记录数据库(EnMicroMsg.db)采用了基于设备标识和用户UIN生成的AES-256-CBC加密方案。理解这一机制,不仅有助于在合法合规前提下进行个人数据备份与恢复,也为开发者进行客户端安全分析、兼容工具开发提供了基础

weixin_30764883的博客 568

Moltbot 超详细安装使用教程(初学者版)

你在外面逛街,用微信/Telegram 发消息说"帮我查一下明天的天气"它立刻帮你查好并回复你说"帮我在电脑上新建一个文件夹叫'工作文档'"它真的帮你在电脑上创建了这就是 Moltbot ——一个能真正帮你干活的 AI 助手。API Key 就像是一把"钥匙",让 Moltbot 能够使用 AI 服务。

weixin_51040479的博客 2013

WaitForSingleObject 等待线程句柄

http://blog.youkuaiyun.com/dyzhen/article/details/5993396 WaitForSingleObject(hThread/*某个线程的句柄*/,INFINITE)可以吗?  hThread代表的线程如果在运行,就要一直等下去,直到线程退出来吗?  如果是这样,就是说我等到的时候,线程已经退出了?我还需要调用类似于ReleaseSema

magicggyy的专栏 2627

【阅读文献笔记】FoundationStereo: Zero-Shot Stereo Matching

提出首个零样本泛化立体匹配基础模型设计 STA 模块融合单目先验提出 AHCF 模块增强代价滤波构建 100 万合成数据集 FSD + 自净化流程。

qq_46460379的博客 1257

事件EVENT与waitforsingleobject的使用以及Mutex与Event的区别

Mutex与Event控制互斥事件的使用详解 最近写一程序,误用了Mutex的功能,错把Mutex当Event用了。 【Mutex】 使用Mutex的主要函数:CreateMutex、ReleaseMutex、OpenMutex、WaitForSingleObject、WaitForMultipleObjects。 CreateMutex:其中第二个参数是表示当前线程拥...

weixin_30567471的博客 208

新手秒变高手:使用一键脚本快速安装OpenClaw并完成初始化配置

一键脚本是一种自动化工具,可以帮助用户快速完成软件的安装和配置过程,无需手动执行繁琐的命令。OpenClaw提供了官方的一键安装脚本,让新手用户也能轻松部署OpenClaw。

一键难忘的博客 358

AD22里面封装修改后,同步到PCB图里面

【摘要】本文介绍了Altium Designer 22中同步更新元件封装的三种方法:1)从PCB库直接更新:在PCB库面板右键选择"Update PCB With[封装名]";2)通过原理图标准更新:使用Design->Update PCB Document菜单;3)在PCB编辑器中验证更新:通过Tools->Update From PCB Libraries菜单。所有方法最终都需通过ECO(工程变更订单)确认变更,建议执行前仔细核对变更内容。这些方法适用于AD22及早期版本

whm128的博客 1758

WaitForSingleObject函数

一下子跳到等待函数 WaitForSingleObject, 是因为下面的 Mutex、Semaphore、Event、WaitableTimer 等同步手段都要使用这个函数; 不过等待函数可不止 WaitForSingleObject 它一个, 但它最简单. function WaitForSingleObject(   hHandle: THandle;      {要等待的对象句柄}

crbrave的专栏 784

105、LLC谐振变换器的LTspice仿真建模

文章摘要:本文分享了LLC谐振变换器在LTspice中的仿真建模经验。作者从实际调试中炸管的教训出发,指出数学计算无法捕捉瞬态问题,必须通过仿真验证。详细介绍了半桥LLC主电路搭建、理想元件选择、开环增益扫频、闭环控制实现等关键步骤,重点讲解了启动过程、ZVS验证和短路保护等高风险工况的仿真技巧。文章提供了实用参数设置建议和LTspice代码片段,强调先开环后闭环的调试顺序,并提醒仿真结果需保留20%设计裕量。最后总结了谐振电流波形观察、死区时间优化等经验性建议。

Jack010169的博客 224

Mutex与Event控制互斥事件的使用详解

最近写一程序,误用了Mutex的功能,错把Mutex当Event用了。 【Mutex】   使用Mutex的主要函数:CreateMutex、ReleaseMutex、OpenMutex、WaitForSingleObject、WaitForMultipleObjects。   CreateMutex:其中第二个参数是表示当前线程拥有权。     TRUE:创建线程获得初始所有权的互斥对象

Sayesan的专栏 1445

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

多线程基础之三:使用event, mutex, semaphore实现多进程间互斥

前面文章介绍了使用mutex和semaphore在多线程场景中实现线程互斥。事实上,因为mutex, semaphore是内核对象,虽然是在某一个进程中创建的,但是由于进程间可以共享内核模块,故而使用mutex, semaphore在进程间作为互斥标识量也是可以的。 0. 使用mutex实现多进程间互斥race_process_mutex_1.cpp#include <stdio.h> #in

墨篙和小奶猫 1968

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

About WaitForSingleObject

Windows的API,类似的还有WaitForMultipleObjects 以上两个api都是要等待Object被标记为有信号(signaled)才会return。windows中设置有信号量,信号量的作用简单理解为标志位。(比如文件的读写,当信号量为FALSE,表明未锁,任意线程可进行访问;否则,信号量为TRUE,则禁止其他线程进行访问) 使用场景:线程A, 线程B, 都要进行访问文件。线程A先行访问文件,线程B在等待。(此时线程B就在一个死循环中,一直尝试去打开文件,此死循环会占用大量内存),

Michael 159

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

WaitForSingleObject

  在多线程的情况下,有时候我们会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultipleObjects。这两个函数都会等待Object被标为有信号(signaled)时才返回的。那么,信号是什么呢?首先我们可以假设这里存在一个文件和两个线程,我们规定这个文件同一时刻只能被一个线程所访问打开...

weixin_30709635的博客 848

WaitForSingleObject()函数

VC声明DWORD WaitForSingleObject(   HANDLE hHandle,   DWORD dwMilliseconds   ); 参数hHandle是一个事件的句柄,第二个参数dwMilliseconds是时间间隔。如果事件是有信号状态返回WAIT_OBJECT_0,如果时间超过dwMilliseconds值但时间事件还是无信号状态则返回WAIT_TIM

技术大白的博客 1万+

WaitForSingleObject()

参见:http://blog.youkuaiyun.com/xiaobai1593/article/details/6672193 1. 格式 DWORD WaitForSingleObject( HANDLEhHandle, DWORDdwMilliseconds); 有两个参数,分别是THandle和Timeout(毫秒单位)。 如果想要等待一条线程,那么你需要指定线程的Hand...

dongbi0665的博客 375

Mutex & Event differences

<br />Mutex物件的做法与特性如下:<br />使用CreateMutex()来产生一个Mutex物件,而传入的Mutex名称字串用以区别不同的Mutex<br />,也就是说,不管是哪个Process/Thread,只要传入的名称叁数是相同的一个字串,那<br />CreateMutex()传回值(hMutex, handle of Mutex)会指向相同的一个Mutex物件。这和<br />Event物件相同。然而Mutex和Event有很大的不同,Mutex有Owner的概念,如果Mutex为

looob的专栏 1407

WaitForSingleObject的作用[转]

总结:WaitForSingleObject( HANDLEhHandle, DWORDdwMilliseconds)是主线程等待hHandle对应的线程. 在多线程的情况下,有时候我们会希望等待某一线程完成了再继续做其他事情(比如主线程等待子线程结束完之后,自己再结束),要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultip...

Stephen___Qin的博客 469

WaitForSingleObject 互斥量/信号/灯事件

<br />WaitForSingleObject 互斥量/信号/灯事件<br />技术_线程/信号量 2009-10-16 15:51:29 阅读208 评论0  字号:大中小 订阅临界区临界区是一种最简单的同步对象,它只可以在同一进程内部使用。它的作用是保证只有一个线程可以申请到该对象void InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection );产生临界区void DeleteCriticalSection(LPCRITICA

ding_net的专栏 1053

多线程编程9认识等待函数WaitForSingleObject

一下子跳到等待函数 WaitForSingleObject, 是因为下面的 Mutex、Semaphore、Event、WaitableTimer 等同步手段都要使用这个函数; 不过等待函数可不止 WaitForSingleObject 它一个, 但它最简单.function WaitForSingleObject( hHandle: THandle;   {要等待的对象句柄} dwMi...

dkopg24406的专栏 225
上一篇: CriticalSection原代码
下一篇: boost_1_32_0在vc2003下的编译
pll621
博客等级 码龄25年 27粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值