在 Linux 或 Unix 系统中使用 pthread_create 创建新线程的步骤

在 Linux 或 Unix 系统中,使用 pthread_create 函数可以创建新线程。下面是创建线程的步骤:


1. 包含头文件 📂

复制代码
#include <pthread.h>
#include <stdio.h>   // 用于输入输出(如 printf)

2. 定义线程函数 🧑‍💻

线程函数必须符合以下原型:

复制代码
void* thread_function(void* arg);
  • 参数void* arg 是传递给线程的参数(可以是任意类型的数据指针)。

  • 返回值 :线程结束时返回一个 void* 类型的指针。

示例:

复制代码
void* print_message(void* arg) {
    char* message = (char*)arg;
    printf("%s\n", message);
    return NULL; // 线程返回值(若无返回值可返回 NULL)
}

3. 创建线程 🧵

使用 pthread_create 函数创建线程:

复制代码
int pthread_create(
    pthread_t* thread_id,          // 输出参数,保存新线程的 ID
    const pthread_attr_t* attr,    // 线程属性(通常设为 NULL 使用默认属性)
    void* (*start_routine)(void*), // 线程函数指针
    void* arg                      // 传递给线程函数的参数
);

示例代码:

复制代码
int main() {
    pthread_t thread_id; // 存储新线程的 ID
    char* message = "Hello from thread!";

    // 创建线程
    int result = pthread_create(
        &thread_id,   // 保存线程 ID
        NULL,         // 默认属性
        print_message,// 线程函数
        (void*)message // 参数(强制转换为 void*)
    );

    if (result != 0) {
        perror("Failed to create thread");
        return 1;
    }

    // 等待线程结束(可选)
    pthread_join(thread_id, NULL);

    printf("Main thread exits.\n");
    return 0;
}

4. 编译并链接线程库 💻

在终端中使用 gcc 编译时,需添加 -lpthread 选项链接线程库:

复制代码
gcc program.c -o program -lpthread

关键注意事项 ⚠️

  1. 参数传递

    • 若需传递多个参数,可以将数据封装到结构体中:

      复制代码
      struct ThreadArgs {
          int num;
          char* text;
      };
    • 在线程函数中通过类型转换获取参数:

      复制代码
      void* thread_func(void* arg) {
          struct ThreadArgs* args = (struct ThreadArgs*)arg;
          // 使用 args->num 和 args->text
      }
  2. 线程生命周期

    • 主线程退出时,所有子线程会被强制终止。若需等待子线程结束,需使用 pthread_join

    • 使用 pthread_detach 可让线程在结束后自动释放资源。

  3. 线程安全

    • 多线程访问共享数据时需使用互斥锁(pthread_mutex_t)或条件变量(pthread_cond_t)。

完整示例代码 🔧

复制代码
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

void* print_message(void* arg) {
    char* message = (char*)arg;
    printf("Thread says: %s\n", message);
    return NULL;
}

int main() {
    pthread_t thread_id;
    char* message = "Hello World!";

    // 创建线程
    if (pthread_create(&thread_id, NULL, print_message, (void*)message)) {
        fprintf(stderr, "Error creating thread\n");
        return 1;
    }

    // 等待线程结束
    pthread_join(thread_id, NULL);

    printf("Main thread exits.\n");
    return 0;
}

通过以上步骤,即可成功创建并运行一个新线程。

相关推荐
邪恶的贝利亚2 小时前
FFMEPG常见命令查询
linux·运维·网络·ffmpeg
搜搜秀2 小时前
find指令中使用正则表达式
linux·运维·服务器·正则表达式·bash
勤劳的进取家3 小时前
贪心算法之最小生成树问题
数据结构·python·算法·贪心算法·排序算法·动态规划
牛奶咖啡.8543 小时前
第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组真题
c语言·数据结构·c++·算法·蓝桥杯
弧襪3 小时前
Ubuntu vs CentOS:Shell 环境加载机制差异分析
linux·ubuntu·centos
Fanxt_Ja4 小时前
【数据结构】红黑树超详解 ---一篇通关红黑树原理(含源码解析+动态构建红黑树)
java·数据结构·算法·红黑树
行思理4 小时前
centos crontab 设置定时任务访问链接
linux·运维·centos
阳光明媚大男孩4 小时前
24.0.2 双系统ubuntu 安装显卡驱动黑屏,系统启动界面键盘失灵
linux·ubuntu·计算机外设
再玩一会儿看代码5 小时前
[特殊字符] 深入理解 WSL2:在 Windows 上运行 Linux 的极致方案
linux·运维·windows·经验分享·笔记·学习方法
那就摆吧5 小时前
数据结构-复杂度详解
数据结构