目录
一、创建线程
pthread_create
是 POSIX 线程(pthreads)库中的一个函数,用于创建一个新的线程。它是多线程编程中常用的函数之一,允许程序并发执行多个任务。
函数原型:
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);参数说明:
thread
: 指向pthread_t
类型的指针,用于存储新创建线程的唯一线程 ID。
attr
: 指向pthread_attr_t
类型的指针,用于设置线程的属性(如栈大小、调度策略等)。如果为NULL
,则使用默认属性。
start_routine
: 线程启动时执行的函数指针。该函数的签名必须是void* func(void*)
,即接受一个void*
参数并返回一个void*
值。
arg
: 传递给start_routine
函数的参数,类型为void*
。返回值:
如果成功创建线程,返回
0
。如果失败,返回一个非零的错误码。
作用
pthread_create
的主要作用是创建一个新的线程,并让该线程从指定的入口函数开始执行。新线程与调用线程(主线程)并发运行,共享进程的地址空间和资源。注意:
1、编译时候记得连接pthread库,-lpthread
2、主线程和子线程是分开执行的,当子线程结束后并不会在继续执行主线程的内容
示例代码:创建一个子线程
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
// 3. 线程函数定义
// 参数:void* arg,表示传递给线程的参数
// 返回值:void*,表示线程的返回值
void *thread_func(void *arg) {
// 无限循环,线程会一直运行
while (1) {
// 打印线程运行信息,arg 是传递给线程的字符串参数
printf("thread running.... %s\n", (char *)arg);
// 线程休眠 1 秒,避免占用过多 CPU 资源
sleep(1);
}
// 线程函数返回 NULL,表示线程正常结束
return NULL;
}
// 主函数
int main(int argc, char *argv[]) {
// 1. 定义一个 pthread_t 类型的变量,用于存储线程 ID
pthread_t thread;
// 2. 创建一个新线程
// 参数:
// - &thread:指向线程 ID 的指针,用于存储新线程的 ID
// - NULL:线程属性,设置为 NULL 表示使用默认属性
// - thread_func:线程函数,指定线程要执行的函数
// - "hello":传递给线程函数的参数,这里是一个字符串
int err = pthread_create(&thread, NULL, thread_func, "hello");
// 4. 检查线程创建是否成功
// pthread_create 返回 0 表示成功,非 0 表示错误
if (err != 0)
{
// 如果创建失败,打印错误信息
// strerror(err) 将错误码转换为可读的错误信息
fprintf(stderr, "pthread_create: %s\n", strerror(err));
// 返回 -1,表示程序异常退出
return -1;
}
// 5. 主线程的无限循环
while (1) {
// 打印主线程的运行信息
printf("main.....\n");
// 主线程休眠 1 秒,避免占用过多 CPU 资源
sleep(1);
}
// 程序正常结束,返回 0
return 0;
}
程序运行流程:
a) 主线程启动,调用 pthread_create 创建一个新线程。
b) 新线程执行 thread_func,不断打印 "thread running.... hello",然后休眠 1 秒。
c) 主线程进入无限循环,不断打印 "main.....",然后休眠 1 秒。
d) 程序会一直并行运行,直到手动终止。
二、线程退出和等待
2.1 线程退出
pthread_exit
用于显式地终止当前线程。与return
语句不同,pthread_exit
可以在线程的任何地方调用,并且可以传递一个返回值给其他线程(例如通过pthread_join
获取)。
函数原型:
#include <pthread.h> void pthread_exit(void *retval);参数说明:
retval
: 线程的返回值,类型为void*
。其他线程可以通过pthread_join
获取这个值。如果不需要返回值,可以传入NULL
。作用:
终止当前线程的执行。
释放线程占用的资源(如栈空间)。
将返回值传递给其他线程(通过
pthread_join
)。与
return
的区别:
return
: 只能在线程函数的末尾调用,返回的值会被隐式传递给pthread_join
。
pthread_exit
: 可以在线程的任何地方调用,显式终止线程并返回一个值。