码农充电站--进程与线程
进程是容器,本身不是执行实体,线程才是执行实体。
进程由两部分组成,
1、内核对象,实质是一个数据结构,由操作系统管理
2、DLL和执行体(包含堆、栈、代码段)
32位的平台下,每个进程有4GB的虚拟内存。
由于进程的开辟和加载,操作系统都要切换上下文环境,因此消耗资源比较大。
而同一进程的多个线程是共享资源的。
于是首选是用多线程而不是多进程。
线程由两部分组成;
1、内核对象,实质是一个数据结构,由操作系统管理
2、线程自己的堆栈
Windows平台上线程分两种
工作线程 界面线程
两者本质上没太大区别,只是工作线程没有消息循环
由于 静态变量 和 全局变量 是放在内存静态区中
从汇编角度来解析就是数据段,独立于代码段,在编译时就已经分配内存
这样的话 那么就是多个线程共享这些资源。也就是说多个线程可以同时访问静态变量和全局变量
因此,多线程访问静态、全局变量时要注意线程安全问题
解决线程安全问题的方式有以下几种:
线程同步实现方式有互斥锁、事件对象、关键代码段
互斥锁和事件对象 属于内核对象 由操作系统直接管理
使用较复杂 占资源 较多
关键代码段是用户对象
使用简单 占资源少
但是容易造成 线程死锁
关键代码段里 包含另外一个关键代码时要 注意线程死锁问题
如下:
线程1 拥有对象A 抢占对象B
线程2 拥有对象B 抢占对象A
有个例子很好的描述线程死锁问题:
哲学家进餐
3个哲学家甲乙丙同时进餐,但每人只有一个筷子。因此每个人都不能吃饭。
若当中一个哲学家甲将自己筷子交出来给其他两位哲学家时,比如交给乙,那么乙就能进餐。
乙吃了一点后,将筷子交出来给丙,接着轮番使用。便能解决进餐问题。
但是这几个哲学家都比较自私和固执,谁也不让于是造成死锁。
看书、实践、思考、总结
转载请注明出处:http://www.cnblogs.com/zhuojun/