多线程编程指南

使用 libthreadlibpthread 链接

对于 POSIX 线程行为(在 Solaris 9 和以前的发行版中),请装入 libpthread 库。对于 Solaris 线程行为,请装入 libthread 库。有的 POSIX 程序员可能想使用 -lthread 进行链接,以保留 fork()fork1() 之间的 Solaris 区别。-lpthread 库使 fork() 的行为方式与 Solaris fork1() 调用的行为方式相同。

在 Solaris 10 和后续发行版中,两个线程库都不再是必需的,但是仍然可以为了实现兼容而指定库。所有的线程功能都已被移入标准 C 库中。要使用 libthread,请在 ld 命令行的 lc 前面指定 -lthread,或在 cc 命令行的末尾指定 -lthread

要使用 libthread,请在 ld 命令行的 -lc 前面指定 -lthread,或在 cc 命令行的末尾指定 -lthread

要使用 libpthread,请在 ld 命令行的 -lc 前面指定 -lpthread,或在 cc 命令行的末尾指定 -lpthread

在 Solaris 9 发行版之前,不应使用 -lthread-lpthread 来链接非线程程序。这样做将在链接时建立在运行时启动的多线程机制。这些机制将使单线程应用程序的速度变慢,浪费系统资源,而且会在调试代码时产生误导性结果。

在 Solaris 9 和后续发行版中,使用 -lthread-lpthread 链接非线程应用程序时不会为程序产生语义差异。也不会创建额外的线程或额外的 LWP。只有主线程会像传统的单线程进程一样执行操作。对程序的唯一影响就是使系统库锁定成为实际锁定,与伪函数调用相反。您必须为获取无竞争锁定付出代价。

在 Solaris 10 发行版之前,如果应用程序没有链接 -lthread-lpthread,则对 libthreadlibpthread 的所有调用都为空操作指令。运行时库 libc 具有许多预定义 libthreadlibpthread 存根,这些存根都是空过程。当应用程序同时链接了 libc 和线程库时,将通过 libthreadlibpthread 插入实际过程。


注 –

对于使用线程的 C++ 程序,请使用 -mt 选项(而不是 -lthread)来编译和链接应用程序。-mt 选项与 libthread 链接,并且能确保正确的库链接顺序。-lthread 可能会导致程序进行核心转储。


在 POSIX 环境中链接

对于 1996 版 POSIX 标准,请使用以下选项来编译和链接应用程序:

cc89 -D_POSIX_C_SOURCE=199506L [flags] file ... [-l rt]

对于 2001 版 POSIX 标准,请使用以下选项来编译和链接应用程序:

cc99 -D_POSIX_C_SOURCE=200112L [flags] file ... [-l rt]

在 Solaris 环境中链接

在 Solaris 线程环境中,请使用以下选项来编译和链接应用程序:

cc -D_REENTRANT -D POSIX_THREAD_SEMANTICS [flags] file ... [-l rt]

在混合环境中链接

在混合环境中,请使用以下选项来编译和链接应用程序:

cc -D_REENTRANT [flags] file ... [-l rt]

在混合使用时,需要包括 thread.hpthread.h