C语言 | 多线程:一篇搞定所有难点

C语言 | 多线程:一篇搞定所有难点

目录

一、创建线程

二、线程退出和等待

2.1 线程退出

2.2 等待线程退出并回收资源

三、线程取消

四、线程分离

五、线程间通信

5.1 信号量

5.2 生产者/消费者

5.3 互斥锁

总结

一、创建线程

pthread_create 是 POSIX 线程(pthreads)库中的一个函数,用于创建一个新的线程。它是多线程编程中常用的函数之一,允许程序并发执行多个任务。

函数原型:

#include

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

#include

#include

#include

#include

// 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

void pthread_exit(void *retval);

参数说明:

retval: 线程的返回值,类型为 void*。其他线程可以通过 pthread_join 获取这个值。如果不需要返回值,可以传入 NULL。

作用:

终止当前线程的执行。

释放线程占用的资源(如栈空间)。

将返回值传递给其他线程(通过 pthread_join)。

与 return 的区别:

return: 只能在线程函数的末尾调用,返回的值会被隐式传递给 pthread_join。

pthread_exit: 可以在线程的任何地方调用,显式终止线程并返回一个值。

相关推荐

新世界动漫手机版app下载-新世界动漫手机版最新apk免费下载v3.6.8
金山彩票中10万会给吗?金山彩票中奖不承认
bt365娱乐线

金山彩票中10万会给吗?金山彩票中奖不承认

📅 07-07 👁️ 1049
电信放心用流量包退订全攻略:手把手教你快速取消,避坑指南看这篇就够了