Electronic Joint Business

Solution for E-Business

Windows 下的多线程同步机制

广义上的进程是程序在计算机上的一次执行活动。当运行一个程序,你就启动了一个进程。显然,程序是静态的,进程是动态的。进程也称为任务。在同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态,这便是多任务。现代的操作系统几乎都是多任务操作系统,能够同时管理多个进程的运行。多任务带来的好处是明显的,比如你可以边听音乐边上网,而这些任务之间丝毫不会相互干扰。 对计算机来说,原则上一个 CPU 只能分配给一个进程,以便运行这个进程。而对于只有一个 CPU 的计算机来说,要想同时运行多个进程,就必须使用并发技术。对于并发技术最容易理解的是“时间片轮转进程调度算法”,即在操作系统的管理下,所有正在运行的进程轮流使用 CPU,每个进程允许占用 CPU 的时间非常短(比如 10 毫秒),这样用户根本感觉不出来 CPU 是在轮流为多个进程服务,就好象所有的进程都在不间断地运行一样。但实际上在任一时间点有且仅有一个进程占有 CPU。如果一台计算机有多个CPU,情况就不同了,如果进程数小于 CPU 数,则不同的进程可以分配给不同的CPU来运行,这样,多个进程就是真正同时运行的,这便是并行。但如果进程数大于 CPU 数,则仍然需要使用并发技术。 狭义上的进程是操作系统的基本执行单位。在 Windows 中,线程是基本执行单位,而进程是一个容纳线程的容器。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。同一进程中的多个线程将共享该进程中的全部系统资源,如虚拟地址空间、文件描述符和信号处理等等。但同一进程中的多个线程各自拥有有名义上私有的调用栈(call stack)、寄存器上下文(register context) 和线程本地存储(thread-local storage)。 由于同一进程内的所有线程共享全部系统资源,所以线程间通信不需要特殊的数据传送机制,不需要建立共享存储区或共享文件,从而使得不同任务之间的协调操作与运行、数据的交互、资源的分配等问题更加易于解决。 与多进程相比,多线程具有以下特点:1 速度:无论是产生速度 还是线程间通信或上下文切换,多线程都比多进程速度快,因为它们在同一个地址空间内。 资源利用率:线程的资源利用率比较好,也是因为它们在同一地址空间内。 同步问题:线程在使用公共变量或共享内存时需要使用同步机制,较为复杂。还是因为它们在同一地址空间内。 同步 所谓线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。我们还会经常看到线程互斥,线程互斥是指多个线程在访问共享的进程内系统资源时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥是一种特殊的线程同步(下文统称为同步)。 线程要访问系统资源包括堆、串口、文件、窗口等等资源。如果一个线程独占了对某个资源的访问,其他线程就无法完成工作。另外一个线程在写入内存的时候,应该限制其他线程读取内存,否则读取的内容将毫无用处。可见线程之间的通信很重要,尤其是在以下两种情况下: 需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性。 一个线程需要通知其他线程某项任务已经完成。 Windows 提供了许多基础设施使线程同步变得更容易。这些设施可以分为两大类:用户模式下的线程同步和使用内核对象进行线程同步。用户模式下的同步构造不涉及 CPU 模式切换,速度快,但是仅限于单个进程,也更容易产生死锁。 使用内核对象同步会导致 CPU 模式切换(从用户模式到内核模式),开销比较大(大约为1000个 CPU 周期),但是支持多个进程间的同步。 本文将先讨论用户模式下的同步机制。 1.原子访问:Interlocked系列函数 http://hi.baidu.com/microsoftxiao/blog/item/a6411546296bc90c6a63e561.html该文章不错。 所谓原子访问,指的是一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源。 我们需要有一种方法能够保证对一个值的递增操作时原子操作——也就是说,不会被打断。Interlocked系列函数提供了我们需要的解决方案。 LONG InterlockedExchangeAdd( PLONG volatile plAddend, […]

,

Leave a Reply

Your email address will not be published. Required fields are marked *