线程的常见问题有哪些?
一些线程问题源于一种经典观点及其固有的并发复杂性。
经典观点
在许多其他多线程操作系统中,线程不仅仅是父任务的一部分,它们就是进程的组成部分。因此,“如果线程调用 fork() 会发生什么,或者(更糟糕的是)如果线程 execve() 某些外部程序会发生什么”这个问题就变得很棘手:整个任务可能会被替换。POSIX 1c 标准将线程调用 fork() 定义为在新进程中仅复制调用线程;而线程中的 execve() 将停止该进程的所有线程。
对于进程采用两种不同的实现和调度器是一个缺陷,这个缺陷从一个实现延续到另一个实现。事实上,一些多任务操作系统由于这些问题(更不用说使内核和库 100% 可重入所需的工作量)而选择不支持线程。例如,符合 POSIX 标准的 Windows NT 不支持线程(Windows NT确实支持线程,但它们不符合 POSIX 标准)。
并发复杂性
大多数人理解任务已经很困难了,更不用说“被分解的任务”或线程了。编程时遇到的首要问题是回答这个问题:“我的应用程序中可以线程化什么?”。这本身可能非常费力的(请参阅关于“哪些类型的事物应该线程化/多任务化?”的部分)。
另一个问题是锁。所有关于共享、锁、死锁、竞争条件等的噩梦都在线程中生动地显现出来。进程通常不必处理这个问题,因为大多数共享数据都是通过管道传递的。现在,线程可以共享文件句柄、管道、变量、信号等。尝试测试和重现错误条件可能会比任性的孩子更让人头疼。
|
|
|
|
|
[上一页] | [首页] | [字典] | [电子邮件作者] | [下一页] |