多线程编程指南

fork() 和 Solaris 线程的特殊问题

在 Solaris 10 发行版之前,Solaris 线程和 POSIX 线程以不同的方式定义 fork() 的行为。有关 fork() 问题的详细讨论,请参见进程创建:execexit 问题

Solaris libthread 同时支持 fork()fork1()fork() 调用具有 "Fork-All" 语义。fork() 可用来复制进程中的所有内容(包括线程和 LWP),从而创建父进程的准确克隆。fork1() 调用所创建的克隆中仅有一个线程,它可复制进程状态和地址空间,但是仅克隆调用线程。

POSIX libpthread 仅支持 fork(),该函数与 Solaris 线程中的 fork1() 具有相同语义。

fork() 具有 "Fork-All" 语义还是 "Fork-One"语义取决于所使用的库。使用 -lthread 进行链接可以赋予 fork() "Fork-All" 语义;使用 -lpthread 进行链接可以赋予 fork() "Fork-One"语义。

从 Solaris 10 发行版开始,fork() 在 Solaris 线程和 POSIX 线程中具有相同的语义。具体来说,fork1() 语义仅复制调用方。对于需要使用“复制全部”语义的应用程序,提供了一个新函数 forkall()

有关更多详细信息,请参见使用 libthreadlibpthread 链接