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 子例程的线程
  • 线程已取消
  • 线程接收到将其终止的信号
  • 由于调用 execexit 子例程,将终止整个进程。
    注: 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