首页 > 代码库 > 码农充电站--进程与线程

码农充电站--进程与线程

码农充电站--进程与线程

 

进程是容器,本身不是执行实体,线程才是执行实体。

进程由两部分组成,

1、内核对象,实质是一个数据结构,由操作系统管理

2、DLL和执行体(包含堆、栈、代码段)

32位的平台下,每个进程有4GB的虚拟内存。

由于进程的开辟和加载,操作系统都要切换上下文环境,因此消耗资源比较大。

 

而同一进程的多个线程是共享资源的。

于是首选是用多线程而不是多进程。

线程由两部分组成;

1、内核对象,实质是一个数据结构,由操作系统管理

2、线程自己的堆栈

 

Windows平台上线程分两种

工作线程  界面线程

两者本质上没太大区别,只是工作线程没有消息循环

 

由于 静态变量  全局变量 是放在内存静态区中

从汇编角度来解析就是数据段,独立于代码段,在编译时就已经分配内存

这样的话 那么就是多个线程共享这些资源。也就是说多个线程可以同时访问静态变量和全局变量

因此,多线程访问静态、全局变量时要注意线程安全问题

 

解决线程安全问题的方式有以下几种:

线程同步实现方式有互斥锁、事件对象、关键代码段

互斥锁和事件对象 属于内核对象  由操作系统直接管理

使用较复杂 占资源 较多

 

关键代码段是用户对象

使用简单 占资源少

但是容易造成 线程死锁

关键代码段里 包含另外一个关键代码时要 注意线程死锁问题

如下:

线程1   拥有对象A  抢占对象B

线程2   拥有对象B  抢占对象A

 

有个例子很好的描述线程死锁问题:

哲学家进餐

3个哲学家甲乙丙同时进餐,但每人只有一个筷子。因此每个人都不能吃饭。

若当中一个哲学家甲将自己筷子交出来给其他两位哲学家时,比如交给乙,那么乙就能进餐。

乙吃了一点后,将筷子交出来给丙,接着轮番使用。便能解决进餐问题。

但是这几个哲学家都比较自私和固执,谁也不让于是造成死锁。

 

看书、实践、思考、总结 

转载请注明出处:http://www.cnblogs.com/zhuojun/

码农充电站--进程与线程