多线程总贴

简介:

进程

从Win32的角度来看,进程含有内存和资源,进程拥有的内存最大可高达2GB。

内存

1. Code 只读的,这是CPU唯一允许执行的内存

2. Data 包括程序中的变量,不包括函数中的局部变量,分为全局变量和静态变量

3. Stack 调用函数时使用,包含局部变量,每个线程创建时都有一个Stack

资源

1. 核心对象-文件句柄,线程等

2. 用户资源-窗口,对话框,字符串等

3. GDI资源-Device Context和Brushes等

进程本身并不能够执行,它只是提供一个安置内存和线程的地方,Matt Pietrek在其Windows 95 System Programming SECRETS一书中的解释是:进程就是一大堆对象拥有权的集合,也就是说,进程拥有对象,进程可以拥有内存(更确切的说是memory context),可以拥有file handles,可以拥有线程,可以拥有一大串DLL模块(被载入这一进程的地址空间)。

 

线程

一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

 

为什么使用多线程而不使用多进程? 

线程比进程廉价,启动和退出更快,占用资源更小,切换更容易。

 

Atomic Operation

同步和异步

同步的(synchronous) 同步synchronization

异步的(asynchronous) 异步asynchronization

假设有两个程序A和B,当程序A调用B时,A停下来不动,直到B执行完以后A才继续执行,这就是所谓的synchronous,若A调用B后,直接继续执行而不管B的状态,这就是所谓的asynchronous,在Win32 API中,SendMessage()是同步行为,而PostMessage()是异步行为。

SendMessage在发送完消息后,会等待该消息处理完毕再返回继续执行,而PostMessage则是发完消息就指着执行,不管发出的消息是否被处理完。

 

Mutex和Critial Section比较

1. 等待Mutex比等待Critical Section的时间要长100倍,因为前者是核心对象,后者不是,前者必须进入kernal mode才起作用,后者在user mode就可以了

2. 前者可以跨进程使用,而后者只能在同一个进程内使用

3. 前者可以指定等待时间,超过该时间则不再等待,后者不能。

注:Mutex是Mutual Exclusion的缩写

 

跨进程使用Mutex

可以给Mutex对象指定名称,其他线程可以用名称来处理该mutex,注意mutex的名称是系统唯一的,所以要使用独一无二的名字。

 

Glossary

cooperative 合作的

preemptive 抢占的 preemptive multitasking 抢占式多任务

二者的区别是,前者不能打断正在运行的任务,后者则可以。

Atomic Operation 原子操作,能够不被中断的一直执行完的操作


本文转自zdd博客园博客,原文链接:http://www.cnblogs.com/graphics/archive/2009/10/27/1590456.html,如需转载请自行联系原作者

相关文章
|
6月前
|
Java API 调度
|
7月前
65.【 多线程2】(五)
65.【 多线程2】
18 0
|
6月前
|
存储 安全 Java
今天聊聊多线程
今天聊聊多线程
22 0
|
6月前
|
Java
多线程
java多线程是指在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。Java中所有变量都储存在主存中,对于所有线程都是共享的。Java中的多线程可以通过继承Thread类或者实现Runnable接口来创建,然后通过start()方法来启动线程。Java中的多线程可以提高程序的并发性和执行效率。
|
7月前
|
调度 C++
多线程
多线程
|
8月前
|
监控 Java API
多线程专题
多线程专题
|
9月前
|
Linux 调度 C++
|
9月前
|
安全 C++
C++多线程(二)
C++多线程
107 0
|
Linux API 调度
C++之多线程(一)
C++进阶之多线程上
101 0
|
Java 调度 C#
C# 多线程
多线程: 进程可以包括若干个线程,同时创建多个线程来完成某项任务,就可以称之为多线程
68 0