【Windows】线程漫谈——线程同步之Slim读/写锁
摘要:本系列意在记录Windwos线程的相关知识点,包括线程基础、线程调度、线程同步、TLS、线程池等。Slim读/写锁SRWLock的目的和关键段相同,对一个资源进行保护,构造了一段“原子访问”的代码,不让其他线程访问它。但与关键段不同的是SRWLock允许区分想要读取资源值的线程和想要写入资源值的线程,因为仅仅读取资源是不会破坏数据的,下面是Slim读/写锁的简单用法:SRWLOCK g_srwLock...//init SRWLockInitializeSRWLock(&g_srwLock);...//当需要写入资源的时候申请"排他锁"AcquireSRWLOckE
阅读全文
【Windows】线程漫谈——线程同步之关键段
摘要:本系列意在记录Windwos线程的相关知识点,包括线程基础、线程调度、线程同步、TLS、线程池等。关键段关键段(Critical Section)是一小段代码,它在执行之前需要独占对一些共享资源的访问权。这种方式可以让多行代码以“原子方式”对资源进行操控。这里的原子方式,指的是代码知道除了当前线程之外,没有其他任何线程会同时访问该资源。当然,系统仍然可以暂停当前线程去调度其他线程。但是,在当前线程离开关键段之前,系统是不会去调度任何想要访问同一资源的其他线程的。下面的代码展示了Critical Section的使用方法:const int COUNT = 10;int g_nSum = 0;C
阅读全文
【Windows】线程漫谈——线程同步之原子访问
摘要:本系列意在记录Windwos线程的相关知识点,包括线程基础、线程调度、线程同步、TLS、线程池等。多线程同步的难题我们知道单核处理器同一时刻只能处理一条指令,操作系统通过时间片调度实现了多任务和多线程。在这个过程中,操作系统随时会中断一个线程(这种中断是以指令为单位的),也就是说完全有可能在一个不确定的时候,线程用完了时间片,控制权交给了另一个线程,另一个线程用完时间片,控制权转回,但是这一进一出有可能一个被共享的全局变量的值已经变了!这也许会带来灾难性的后果,也许不会。因此,站在系统层面考虑,每当属于线程的时间片用完之后,系统要把当前CPU寄存器的值(比如,指令寄存器,栈指针寄存器)写入线程
阅读全文
【Windows】线程漫谈——线程栈
摘要:本系列意在记录Windwos线程的相关知识点,包括线程基础、线程调度、线程同步、TLS、线程池等。预备知识众所周知,线程在初始化时,系统会为其分配线程栈,用于局部变量、函数调用时的参数等。在开始讨论前,先交代一些背景知识。栈:一种先入后出的数据结构,push和pop是它典型的操作,对应“入栈”和“出栈”的术语。系统内存的分配机制:简单的说包括“预订”和“调拨”两个过程。预订并不真正分配物理存储器,只是对进程虚拟地址空间中的内存进行“预分配”,以使得这块内存不至于被当前进程的其他指令分配;调拨就是为预订的内存空间分配物理存储器(windows中物理存储器可能是物理内存,也可能是内存页交换文件)。
阅读全文
【Windows】线程漫谈——线程基础
摘要:本系列意在记录Windwos线程的相关知识点,包括线程基础、线程调度、线程同步、TLS、线程池等。进程与线程理解线程是至关重要的,每个进程至少有一个线程,进程是线程的容器,线程才是真正的执行体,线程必然在某个进程的上下文中运行。进程拥有惰性,如果进程中所有的线程都已结束,那么进程也就没有存在的必要了。一个进程由如下两部分组成:1、一个进程地址空间;2、一个进程内核对象一个线程由如下两部分组成:1、一个线程栈;2、一个线程内核对象线程的开销要比进程少很多,所以在解决编程问题的时候尽量考虑在当前进程中创建线程而不是创建新的进程。然而,线程的切换需要消耗一定数量的CPU资源,因此,也不是说可以毫无顾
阅读全文