news 2026/4/30 9:08:17

线程的创建

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
线程的创建

文章目录

  • clone()
  • pthread_create()
    • 函数原型
    • 参数(按重要顺序)
    • 返回值
    • 错误处理
      • 例程
    • 编译命令

clone()

  • 进程的创建可以使用fork(),除了fork()以外还有一些系统调用可以实现进程的创建
  • clone是Linux特有的系统调用,功能比fork()更强大、更灵活
  • 早期LinuxThreads线程库就是用clone()创建独立进程来模拟线程
#define_GNU_SOURCE#include<sched.h>intclone(int(*fn)(void*),void*stack,intflags,void*arg,.../* pid_t *parent_tid, void *tls, pid_t *child_tid */);
  • 通过flags参数精确控制新创建的“执行流”与父进程共享哪些资源
    • CLONE_VM:共享内存空间(即创建线程)
    • CLONE_FILES:共享文件描述符表
    • CLONE_FS:共享文件系统信息(如根目录、当前工作目录)
    • CLONE_SIGHAND:共享信号处理程序表
  • clone()并不是一个被广泛使用的函数接口,是特定于 Linux 的,不应用于旨在可移植的程序中
    • 可移植性差:是Linux特有的,可能无法在其他类Unix系统上编译
    • 接口复杂:需要手动管理栈空间(stack参数)、线程本地存储(tls)等,容易出错
    • 抽象层次低:pthread_create()对clone()进行了封装,提供了更安全、更符合POSIX标准的抽象

pthread_create()

  • 创建一个新线程并启动执行

函数原型

#include<pthread.h>intpthread_create(pthread_t*thread,constpthread_attr_t*attr,void*(*start_routine)(void*),void*arg);

参数(按重要顺序)

参数类型作用注意事项
**start_routine**void *(*)(void *)线程入口函数
新线程从这个函数开始执行
1. 函数签名必须严格匹配:接收一个void*
参数,返回一个void*值 2. 线程正常结束时,应调用pthread_exit()return一个值
**arg**void *传递给start_routine唯一参数如果需要传递多个参数,需要将它们打包到一个struct里,然后传递这个结构的指针
**thread**pthread_t *输出参数。用于存储新创建线程的标识符(ID)成功返回后,*thread中会填入有效的线程ID,可用于pthread_join,pthread_detach等操作。
**attr**pthread_attr_t *线程属性对象。用于设置新线程的栈大小、调度策略、分离状态等最常用的情况是传入**NULL**,表示使用所有默认属性。需要非默认设置时才需要创建和配置pthread_attr_t
对象

返回值

  • 成功:返回 0。
  • 失败:返回一个正的错误号(如 EAGAIN, EINVAL, EPERM)

pthread_create() 不会设置全局变量 errno,错误信息直接通过返回值给出

错误处理

方式代码示例是否正确说明
错误方式if (ret < 0) {
perror(“…”); }
错误1. 错误判断条件错(应该!=0)2.perror依赖于errno,但errno未被设置。
移植方式errno = ret;
perror(“…”);
可用
但不推荐
人为将错误号赋给errno,再利用perror。这增加了步骤,且perror的输出格式固定。
推荐方式fprintf(stderr, “%s\n”, strerror(ret));最佳实践使用strerror()函数将错误号ret直接转换为可读的字符串。这是处理Pthreads函数错误的标准方法
  • 推荐 strerror方式:
    • 意图清晰:明确表示在处理Pthreads的错误
    • 线程安全:strerror的线程安全版本(strerror_r)在多线程环境下更安全
    • 格式化灵活:可以自由控制错误信息的输出格式
  • 常见错误码:
    • EAGAIN:资源不足,无法创建另一个线程。
    • EINVALattr中的设置无效。
    • EPERM: 没有权限设置attr中指定的调度策略和参数

例程

  • perror()方式
#include<pthread.h>#include<stdio.h>#include<stdlib.h>#include<errno.h>void*func(void*arg){printf("Hello thread!\n");pthread_exit(NULL);}intmain(intargc,constchar*argv[]){pthread_ttid;intret=pthread_create(&tid,NULL,func,NULL);if(ret!=0){errno=ret;perror("pthread_create");exit(EXIT_FAILURE);}printf("tid=%lu\n",tid);pthread_join(tid,NULL);return0;}
  • strerror()方式
#include<pthread.h>#include<stdio.h>#include<stdlib.h>#include<string.h>void*func(void*arg){printf("Hello thread!\n");pthread_exit(NULL);}intmain(intargc,constchar*argv[]){pthread_ttid;intret=pthread_create(&tid,NULL,func,NULL);if(ret!=0){fprintf(stderr,"pthread_create:%s\n",strerror(ret));exit(EXIT_FAILURE);}printf("tid=%lu\n",tid);pthread_join(tid,NULL);return0;}

编译命令

gcc-omy_program my_program.c-pthread

必须使用 -pthread 选项(注意是 -pthread,不是 -lpthread,虽然后者通常也行)

-pthread会正确设置必要的宏定义和链接库

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 17:39:08

3分钟快速上手:macOS平台QQ音乐加密文件完全解密指南

3分钟快速上手&#xff1a;macOS平台QQ音乐加密文件完全解密指南 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#xff0c;默认转…

作者头像 李华
网站建设 2026/4/25 11:42:52

六音音源修复终极指南:3步快速解决洛雪音乐播放难题

六音音源修复终极指南&#xff1a;3步快速解决洛雪音乐播放难题 【免费下载链接】New_lxmusic_source 六音音源修复版 项目地址: https://gitcode.com/gh_mirrors/ne/New_lxmusic_source 还在为洛雪音乐升级后无法播放歌曲而烦恼吗&#xff1f;六音音源修复方案为您提供…

作者头像 李华
网站建设 2026/4/28 6:37:57

Unity自动翻译终极指南:从零开始构建国际化游戏体验

Unity自动翻译终极指南&#xff1a;从零开始构建国际化游戏体验 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 在当今全球化游戏市场中&#xff0c;为Unity项目集成多语言支持已成为开发者的必备技能。X…

作者头像 李华
网站建设 2026/4/17 22:12:33

DownKyi视频下载工具终极指南:从入门到精通的专业技巧

DownKyi视频下载工具终极指南&#xff1a;从入门到精通的专业技巧 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#…

作者头像 李华
网站建设 2026/4/29 5:23:47

百度网盘提取码智能查询工具:告别繁琐搜索的全新体验

百度网盘提取码智能查询工具&#xff1a;告别繁琐搜索的全新体验 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘分享资源的提取码而烦恼吗&#xff1f;面对加密分享链接&#xff0c;传统的人工查找方式既耗时又…

作者头像 李华
网站建设 2026/4/28 17:31:08

macOS终极音频解密指南:轻松解锁QQ音乐加密文件

macOS终极音频解密指南&#xff1a;轻松解锁QQ音乐加密文件 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#xff0c;默认转换结果…

作者头像 李华