thr_create(3C) 例程是 Solaris 线程接口中最详细的所有例程其中之一。
使用 thr_create(3C) 可以向当前的进程中增加新的受控线程。对于 POSIX 线程,请参见pthread_create 语法。
#include <thread.h> int thr_create(void *stack_base, size_t stack_size, void *(*start_routine) (void *), void *arg, long flags, thread_t *new_thread); size_t thr_min_stack(void);
请注意,新线程不会继承暂挂的信号,但确实会继承优先级和信号掩码。
stack_base。包含新线程所使用的栈的地址。如果 stack_base 为 NULL,则 thr_create() 会为新线程分配一个至少为 stack_size 字节的栈。
stack_size。包含新线程所使用的栈的大小(以字节数表示)。如果 stack_size 为零,则使用缺省大小。在大多数情况下,零值最适合。如果 stack_size 不为零,则 stack_size 必须大于 thr_min_stack() 返回的值。
通常,无需为线程分配栈空间。系统会为每个线程的没有保留交换空间的栈分配 1 MB 的虚拟内存。系统使用 mmap(2) 的 -MAP_NORESERVE 选项来进行分配。
start_routine。包含用以开始执行新线程的函数。start_routine() 返回时,该线程将退出,并且其退出状态会设置为 start_routine 返回的值。请参见thr_exit 语法。
arg。可以是 void 所描述的任何变量,通常是任何大小为 4 字节的值。对于较大的值,必须通过将该参数指向对应的变量来间接传递。
请注意,仅可以提供一个参数。要在程序中采用多个参数,请将多个参数编码为单个参数,如通过将这些参数放在一个结构中。
flags。指定所创建的线程的属性。在大多数情况下,最适合使用零值。
flags 中的值是通过对以下参数执行按位或运算(包含边界值)来构造的:
THR_SUSPENDED。暂停新线程,并且不执行 start_routine,直到 thr_continue() 启动该线程为止。使用 THR_SUSPENDED 可以在运行该线程之前对其执行操作,如更改其优先级。
THR_DETACHED。分离新线程,以便在该线程终止之后,可以立即重用其线程 ID 和其他资源。如果不想等待线程终止,可以设置 THR_DETACHED。
如果没有明确分配同步,则未暂停的分离线程会失败。如果失败,则从 thr_create() 返回该线程的创建者之前,会将该线程 ID 重新指定给另一个新线程。
THR_BOUND。将新线程永久绑定到 LWP。新线程是绑定线程。从 Solaris 9 发行版开始,系统不再区分绑定线程和非绑定线程,所有的线程均视为绑定线程。
THR_DAEMON。将新线程标记为守护进程。守护进程线程始终处于分离状态。THR_DAEMON 表示 THR_DETACHED。所有非守护进程线程退出时,该进程也会随之退出。守护进程线程不会影响进程的退出状态,并且在退出对线程数进行计数时会被忽略。
进程的退出方法有两种,一是调用 exit(),二是使用进程中不是通过 THR_DAEMON 标志创建的每个线程来调用 thr_exit(3C)。 进程所调用的应用程序或库可以创建一个或多个线程,在确定是否退出时应当忽略(不计数)这些线程。THR_DAEMON 标志可标识在进程退出条件中不计数的线程。
new_thread。如果 new_thread 不为 NULL,则它将指向 thr_create() 成功时用来存储新线程 ID 的位置。调用方负责提供该参数所指向的存储空间。线程 ID 仅在调用进程中有效。
如果对该标识符不感兴趣,请向 new_thread 提供一个 NULL 值。
thr_create() 函数在成功完成之后返回零。其他任何返回值都表示出现了错误。如果检测到以下情况之一,thr_create() 将失败并返回对应的值。
EAGAIN
描述:超出了系统限制,如创建的 LWP 过多。
ENOMEM
描述:可用内存不足,无法创建新线程。