多线程编程指南

选择正确的 Fork

从 Solaris 10 发行版开始,对 fork() 的调用与对 fork1() 的调用相同。具体来说,在子进程中仅复制调用线程。此行为与 POSIX fork() 的行为相同。

在以前的 Solaris 软件发行版中,fork() 的行为取决于应用程序是否与 POSIX 线程库相链接。如果与 -lthread(Solaris 线程)链接,但没有与 -lpthread(POSIX 线程)链接,则 fork()forkall() 相同。如果与 -lpthread 链接,无论 fork() 是否还与 -lthread 链接,fork() 都与 fork1() 相同。

从 Solaris 10 发行版开始,多线程不需要 -lthread-lpthread。标准 C 库为两组应用程序程序接口提供所有的线程支持。需要复制所有 fork 语义的应用程序必须调用 forkall()

调用任何 fork() 函数后,使用全局状态时要非常小心。

例如,当一个线程连续读取文件,而进程中的另一个线程成功 fork 时,每个进程都包含读取该文件的线程。由于在调用 fork() 后会共享文件描述符的查找指针,因此在子线程获取数据的同时,父进程会获取不同的数据。由于父线程和子线程将获取不同的数据,因此会给连续读取访问带来间隙。