事件与等待
文章平均质量分 90
My classmates
QQ349561280
展开
-
7.互斥体
为什么要有互斥体:等待对象被遗弃互斥体(MUTANT)与事件(EVENT)和信号量(SEMAPHORE)一样,都可以用来·进行线程的同步控制。但需要指出的是,这几个对象都是内核对象,这就意味着,通过这些对象可以进行跨进程的线程同步控制,比如:A进程中的X线程与B进程中的Y线程,它们可以共同使用一个内核对象来进行线程同步控制。极端情况:如果B进程的Y线程还没有来得及调用修改SignalS...原创 2018-10-28 13:33:20 · 1776 阅读 · 0 评论 -
1.临界区
并发是指多个线程在同时执行:单核–(是分时执行,不是真正的同时)多核–(在某一个时刻,会同时有多个线程再执行)同步则是保证在并发执行的环境中各个线程可以有序的执行分析两条线程执行下面代码。DWORD dwVal =0; //全局变量线程中的代码:dwVal ++; //只有一行安全吗?对应的汇编代码:mov eax,[0x12345678] add eax,1 mov ...原创 2018-10-25 17:12:10 · 429 阅读 · 0 评论 -
2.自旋锁
1、不同版本的内核文件单核:2-9-9-12分页 ntkrnlpa.exe10-10-12分页 ntoskrnl.exe多核:2-9-9-12分页 ntkrnlpa.exe10-10-12分页 ntoskrnl.exe文件虽然相同但单核与多核的代码是不一样的,自旋锁只有在多核下才是有价值的。Windows自旋锁参考: KeAcquireSpinLockAtDpcLevel多核...原创 2018-10-25 22:26:59 · 275 阅读 · 0 评论 -
3.线程等待与唤醒
我们在之前的讲解了如何自己实现临界区以及什么是Windows自旋锁,这两种同步方案在线程无法进入临界区时都会让当前线程进入等待状态,一种是通过Sleep函数实现的,一种是通过让当前的CPU"空转”实现的,但这两种等待方式都有局限性:通过Sleep函数进行等待,等待时间该如何确定呢?通过“空转”的方式进行等待,只有等待时间很短的情况下才有意义,否则对CPU资源是种浪费。而且自旋锁只能在多核的环...原创 2018-10-26 09:42:53 · 736 阅读 · 0 评论 -
4.WaitForSingleObject函数分析
无论可等待对象是何种类型,线程都是通过:WaitForSingleObjectWaitForMultipleObjects进入等待状态的,这两个函数是理解线程等待与唤醒进制的核心WaitForSingleObject参数说明WaitForSingleObject对应的内核函数:NTSTATUS stdcall NtWaitForSingleObject( HANDLE Handl...原创 2018-10-26 19:27:55 · 834 阅读 · 0 评论 -
5.事件
在之前的课程里面讲过,线程在进入临界区之前会调用WaitForSingleObject或者WaitForMultipleOobjects,此时如果有信号,线程会从函数中退出并进入临界区,如果没有信号那么线程将自己挂入等待链表,然后将自己挂入等待网,最后切换线程。其他线程在适当的时候,调用方法修改被等待对象的 SignalState 为有信号(不同的等待对象,会调用不同的函数),并将等待该对象的其...原创 2018-10-27 14:12:39 · 222 阅读 · 0 评论 -
6.信号量
事件(EVENT)对象,线程在进入临界区之前会通过调用 WaitForSingleObject或者WaitForMultipleObjects来判断当前的事件对象是否有信号 (SignalState>0),只有当事件对象有信号时,才可以进入临界区(只允许一个线程进入直到退出的一段代码,不单指用EnterCriticalSection()和LeaveCriticalSection()而形成的临...原创 2018-10-27 20:21:25 · 332 阅读 · 0 评论