大部分数据,使用相同的地址空间,因此启动一个线程,切换一个线程远比进程
操作要快,花费也要小得多。当然,线程是拥有自己的局部变量和堆栈(注意不
是堆)的,比如在 windows 中用_beginthreadex 创建一个新进程就会在调用
CreateThread 的同时申请一个专属于线程的数据块(_tiddata)。
c.线程之间的通信比较方便。统一进程下的线程共享数据(比如全局变量,
静态变量),通过这些数据来通信不仅快捷而且方便,当然如何处理好这些访问
的同步与互斥正是编写多线程程序的难点。而进程之间的通信只能通过进程通信
的方式进行。
d.由 b,可以轻易地得到结论:多进程比多线程程序要健壮。一个线程死掉
整个进程就死掉了,但是在保护模式下,一个进程死掉对另一个进程没有直接影
响。
e.线程的执行与进程是有区别的。每个独立的线程有有自己的一个程序入口,
顺序执行序列和程序的出口,但是线程不能独立执行,必须依附与程序之中,由
应用程序提供多个线程的并发控制。
2. 什么是线程安全?(2012 年 5 月百度实习生面试)
如果多线程的程序运行结果是可预期的,而且与单线程的程序运行结果一样,
那么说明是“线程安全”的。
3. 秒杀多线程中的题目 解答
a.线程的概念、线程的基本状态及状态之间的关系另外,这个网址里面讲操
作系统的知识倒是挺详实的,还有另外一种解释线程概念
b.多线程的几种实现方法分别是什么?
这个貌似在 java 面试中会出现,我是专注于 c++的,无视掉,但是不得不说,
秒杀多线程面试题系列真心是个好总结
c.多线程同步与互斥有几种实现方法?都是什么?(C++)
临界区(CS:critical section)、事件(Event)、互斥量(Mutex)、信号量
(semaphores),需要注意的是,临界区是效率最高的,因为基本不需要其他的
开销,
二内核对象涉及到用户态和内核态的切换,开销较大,另外,关键段、
互斥量具有线程所有权的概念,因此只可以用于线程之间互斥,而不能用到
同步中。
只有互斥量能完美解决进程意外终止所造成的“遗弃问题”。
d.多线程同步和互斥有何异同,在什么情况下分别使用他们?举例说明
所谓同步,表示有先有后,比较正式的解释是“线程同步是指线程之间所
具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另
一个
线程的消息时应等待,直到消息到达时才被唤醒。”所谓互斥,比较正式
的说明是“线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它
性。
当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线
程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。
线程互斥可以看成是一种特殊的线程同步。”表示不能同时访问,也是个
顺序问题,所以互斥是一种特殊的同步操作。
举个例子,设有一个全局变量 global,为了保证线程安全,我们规定只有
当主线程修改了 global 之后下一个子线程才能访问 global,这就需要同步主线程