多线程编程指南

创建线程

thr_create(3C) 例程是 Solaris 线程接口中最详细的所有例程其中之一。

使用 thr_create(3C) 可以向当前的进程中增加新的受控线程。对于 POSIX 线程,请参见pthread_create 语法

thr_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_baseNULL,则 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_create() 返回该线程的创建者之前,会将该线程 ID 重新指定给另一个新线程。


new_thread。如果 new_thread 不为 NULL,则它将指向 thr_create() 成功时用来存储新线程 ID 的位置。调用方负责提供该参数所指向的存储空间。线程 ID 仅在调用进程中有效。

如果对该标识符不感兴趣,请向 new_thread 提供一个 NULL 值。

thr_create 返回值

thr_create() 函数在成功完成之后返回零。其他任何返回值都表示出现了错误。如果检测到以下情况之一,thr_create() 将失败并返回对应的值。


EAGAIN

描述:

超出了系统限制,如创建的 LWP 过多。


ENOMEM

描述:

可用内存不足,无法创建新线程。


EINVAL

描述:

stack_base 不为 NULL,并且 stack_size 小于 thr_min_stack() 返回的值。