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

目录

一、创建线程

二、线程退出和等待

2.1 线程退出

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

三、线程取消

四、线程分离

五、线程间通信

5.1 信号量

5.2 生产者/消费者 

5.3 互斥锁

总结


一、创建线程

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


函数原型:

#include <pthread.h>

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

参数说明:

  1. thread: 指向 pthread_t 类型的指针,用于存储新创建线程的唯一线程 ID

  2. attr: 指向 pthread_attr_t 类型的指针,用于设置线程的属性(如栈大小、调度策略等)。如果为 NULL,则使用默认属性

  3. start_routine: 线程启动时执行的函数指针。该函数的签名必须是 void* func(void*),即接受一个 void* 参数并返回一个 void* 值。

  4. 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

作用:

  1. 终止当前线程的执行。

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

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

与 return 的区别:

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

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值