pthread

pthread_create 创建一个新线程

概要

1
2
3
4
5
6
#include <pthread.h>

int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)(void *),
void *arg);

描述

pthread_create() 函数用于在进程内创建一个具有 attr 指定的属性的新线程。如果 attrNULL,则使用默认属性。如果稍后修改 attr 指定的属性,则该线程的属性不会受到影响。成功完成后,pthread_create() 将创建的线程的 ID 存储在线程指定的位置。

通过使用 arg 作为唯一参数执行 start_routine 来创建线程。如果 start_routine 返回,则效果就像使用 start_routine 的返回值作为退出状态对 pthread_exit() 进行了隐式调用。请注意,最初在其中调用 main() 的线程与此不同。当它从 main() 返回时,效果就像使用 main() 的返回值作为退出状态隐式调用 exit() 一样。

线程退出后,该线程的存储必须由另一个线程通过调用 pthread_join() 回收。或者,可以在线程上调用 pthread_detach() 来指示系统可以在退出时自动回收线程存储。为了获得与在新创建的线程上调用 pthread_detach() 相同的效果,可以在传递给 pthread_create()attr 参数上使用 pthread_attr_setdetachstate() 函数。

新线程的信号状态初始化为:

  • 信号掩码从创建线程继承。
  • 等待新线程的信号集为空。

返回值

如果成功,则 pthread_create() 函数将返回零。 否则,将返回错误编号以指示错误。

错误

如果出现以下情况,pthread_create() 函数将失败:

  • 系统缺少创建另一个线程的必要资源,否则将超出系统对进程 [PTHREAD_THREADS_MAX] 中线程总数的限制。
  • 调用方没有适当的权限来设置所需的调度参数或调度策略。
  • attr 指定的值无效。

案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <pthread.h>

// 要在线程中执行的函数,也可以称作为任务
void* function(void *arg) {
// 打印
printf("%s", arg);
// 回收线程
// pthread_self() 当前线程 ID
pthread_detach(pthread_self());
return NULL;
}

int main(int argc, char *argv[]) {
// 线程句柄
pthread_t thread = 0;

// 要传的参数
char *msg = "我是一个子线程";

// 线程的属性
pthread_attr_t *attr = NULL;

int result_code = pthread_create(&thread, attr, function, msg);

if (result_code == 0) {
printf("线程创建成功");
} else {
// 其它情况
}

// 回收线程,会阻塞主线程
// pthread_join(thread, NULL);

// 回收线程,不会阻塞主线程
pthread_detach(thread);
}