线程的缺点
线程数:
- 序列化内存操作。那就是内核,因此MMU必须服务于诸如
mmap()
执行页面分配之类的操作。 - 共享相同的文件描述符表。该表中涉及锁定,包括更改和执行查找,该表存储诸如文件偏移量和其他标志之类的内容。使用该表进行的每个系统调用(例如
open()
,accept()
)都fcntl()
必须将其锁定以转换fd
为内部文件句柄以及进行更改。 - 共享一些调度属性。不断评估流程以确定它们施加在系统上的负载,并据此计划。大量线程意味着更高的CPU负载,而调度程序通常不喜欢这样做,这会增加对该进程事件的响应时间(例如,读取套接字上的传入数据)。
- 可能共享一些可写的内存。由多个线程写入的任何内存(如果需要花式锁定,则特别慢),将生成各种缓存争用和处理问题。例如堆操作,例如
malloc()
和free()
在全局数据结构上操作(可以在某种程度上解决)。还有其他全球结构。 - 共享凭据,这可能是服务类型流程的问题。
- 共享信号处理,这些将在处理信号时中断整个过程。
进程还是线程?
- 如果要简化调试,请使用线程。
- 如果您使用的是Windows,请使用线程。(在Windows中,进程非常重要)。
- 如果稳定性是一个很大的问题,请尝试使用过程。(
SIGSEGV/PIPE
仅此而已…)。 - 如果线程不可用,请使用进程。(现在还不那么普遍,但是确实发生了)。
- 如果您的线程共享无法在多个进程中使用的资源,请使用线程。(或提供IPC机制以允许与资源的“所有者”线程进行通信)。
- 如果您使用的资源仅基于每个进程一个(而每个上下文仅一个),那么显然使用进程。
- 如果您的处理上下文绝对不共享任何内容(例如,套接字服务器在生成连接时就产生并忘记了连接
accept()
),而CPU是瓶颈,则请使用进程和单线程运行时(这些运行时应避免进行各种密集锁定,例如on)。堆和其他地方)。 - 线程和进程之间最大的区别之一是:线程使用软件构造来保护数据结构,进程使用硬件(速度 明显 更快)。
链接
- pthreads(7)
- 关于进程和线程(MSDN)
- 线程与进程



