pthread_create 子例程
用途
创建一个新线程,初始化它的属性并使它可以运行。
库
线程库 (libpthreads.a)
语法
#include <pthread.h>
int pthread_create (thread, attr, start_routine (void *), arg)
pthread_t *thread;
const pthread_attr_t *attr;
void *(*start_routine) (void *);
void *arg;
描述
pthread_create 子例程创建一个新线程,并使用 attr 参数指定的线程属性对象来初始化其属性。 新线程继承其创建线程的信号掩码; 但将为新线程清除创建线程的任何暂挂信号。
新线程可运行,并将开始执行 start_routine 例程,参数由 arg 参数指定。 arg 参数是一个空指针; 它可以引用任何类型的数据。 建议不要将此指针强制转换为标量数据类型 (例如int ) ,因为强制转换可能不可移植。
在创建线程之后,可以复用线程属性对象来创建另一个线程,或者将其删除。
在以下情况下,线程将终止:
- 从其启动例程 (初始线程的 main 例程) 返回的线程
- 称为 pthread_exit 子例程的线程
- 线程已取消
- 线程接收到将其终止的信号
- 由于调用 exec 或 exit 子例程,将终止整个进程。注: pthread.h 头文件必须是使用线程库的每个源文件的第一个包含文件。 否则,应使用 -D_THREAD_SAFE 编译标志,或使用 cc_r 编译器。 在这种情况下,会自动设置标志。
在进程中创建多个线程时,将为所有信号设置 FULL_CORE 标志。 这意味着如果生成核心文件,那么它将比单线程应用程序大得多。 这是调试多线程进程所必需的。
当进程使用 pthread_create 函数并因此变为多线程时,将对所有信号启用 FULL_CORE 标志。 如果接收到其操作是通过核心转储来终止进程的信号,那么将生成完全转储 (通常比常规转储大得多)。 这是必需的,以便可以使用 dbx 命令调试多线程程序。
下面这篇伪代码就是一个如何避免获得全核心的例子。 请注意,在这种情况下,将无法进行调试。 使用 ulimit 命令可以更轻松地限制核心的大小。
struct sigaction siga;
siga.sa_handler = SIG_DFL;
siga.sa_flags = SA_RESTART;
SIGINITSET(siga.as_mask);
sigaction(<SIGNAL_NUMBER>, &siga, NULL);
不会继承备用堆栈。
参数
项 | 描述 |
---|---|
线程 | 指向将存储线程标识的位置。 |
attr | 指定要在创建线程时使用的线程属性对象。 如果值为 NULL,那么将使用缺省属性值。 |
启动例程 | 指向要由线程执行的例程。 |
arg | 指向要传递到 start_routine 例程的单个自变量。 |
返回值
如果成功, pthread_create 函数将返回零。 否则,将返回错误号以指示错误。
错误代码
在下列情况下, pthread_create 函数将失败:
项 | 描述 |
---|---|
再次 | 如果 WLM 正在运行,那么将达到类中线程数的限制。 |
再次 | 已达到每个进程的线程数限制。 |
EINVAL | attr 指定的值无效。 |
EPERM | 调用者没有相应的许可权来设置所需的调度参数或调度策略。 |
pthread_create 函数不会返回错误代码 EINTR。