所有线程函数相同点:
(1)函数调用成功返回 0,失败返回错误号(但注意:不能用 perror 打印)。
(2) 头文件:#include <pthread.h> 编译时候需要使用线程库,因此需要加 -pthread。

一、创建线程

int pthread_create(
pthread_t *thread, //线程 ID = 无符号长整形 %lu //传出参数,以返回值告知创建的线程 ID
const pthread_attr_t *attr, // 线程属性:不设置线程分离 -- NULL
void *(*start_routine) (void *), // 线程都有明确的任务 // 回调函数形式 void* func(void* arg)
void *arg // 线程处理函数的参数 // 给回调函数传参
);

返回值:
成功 :返回 0
失败 :返回 错误号

二、获得当前线程 ID

pthread_t pthread_self(void); //永远成功

返回值类型:pthread_t 。

三、练习创建线程

创建 5 个子线程,各线程专门打印自己线程 ID,并判断是第几个子线程。

void* myfunc(void* arg)
{ int num = (int)argprintf( "%dth child thread id = %lu\n", num , pthread_self() ); // 打印子线程IDreturn NULL; // 比较正规的是使用 pthread_exit
}
int main()
{pthread_t pthid[5]; //线程ID,传出参数,因此先定义好for(int i = 0; i < 5; i++){ // pthread_create(&pthid[i], NULL, myfunc, (void*)&i);// 如果传参是 i 的地址,回调函数中读取的是该地址中的数值,同一地址存放的数值会随着循环被覆盖而变化
// 循环太快的话,没等子线程打印出来 i 值,该地址中存放的 i 值就变了,导致无法正确输出是第几个线程// 改进:值传递(直接回调函数中读数值,与地址无关,值改变就没有影响了)int ret = pthread_create(&pthid[i], NULL, myfunc, (void*)i);// 如何打印错误信息(不能用perror,而是用strerror)
if(ret != 0) { // 创建失败,成功 返回 0
printf(“error num : %d\n”, ret); // 打印错误号
printf(“%s\n”, strerror(ret) ); // strerror(ret) 需要头文 #include<string.h>
} 参数:错误号,返回值类型:char*}return 0;
}

Linux学习之系统编程篇:创建线程函数相关推荐

  1. Linux学习之系统编程篇:线程同步的引出和思想

    一.线程同步的引出 程序:父子线程交替数数 #include <stdio.h> #include <unistd.h> #include <string.h> # ...

  2. Linux学习之系统编程篇:实现线程分离

    函数: int pthread_detach(pthread_t thread); // 参数:线程 ID 最大特点: (1)子进程会自己回收 PCB,因此调用该函数之后,不需要调用 pthread_ ...

  3. Linux学习之系统编程篇:对线程的基本认识

    (1)fork()后创建的子进程是父进程的拷贝,那么pthread_create,创建线程,创建的线程跟原进程有什么关系呢? fork 会通过拷贝产生新的虚拟地址空间(PCB 会变化),而 pthre ...

  4. Linux学习之系统编程篇:单个线程的退出函数

    能否用 exit 来退出某个线程,exit 是用来退出进程的,因为父子线程共享同一地址空间,如果在某线程中使用,会使 所有线程全退出,因此需要使用别的函数 :pthread_exit (注意:子线程使 ...

  5. Linux学习之系统编程篇:使用信号量实现“生产者和消费者模型”

    模型中,最为关键的步骤是,在生产者回调函数中,未生产之前,消费者回调函数是阻塞的,阻塞方式是条件变量. 那么不使用条件变量,如何使用"信号量"实现阻塞呢? 答案是因为调用 sem_ ...

  6. Linux学习之系统编程篇:杀死 / 取消线程

    函数: int pthread_cancel(pthread_t thread);//参数:线程 ID 注意:并不是调用了 pthread_cancel,就一定能杀死进程, 必须死在"取消点 ...

  7. Linux学习之系统编程篇:练习验证线程共享全局变量

    #include <pthread.h> #include <stdio.h> #include <unistd.h> int var = 1001; void * ...

  8. Linux学习之系统编程篇:IPC 和管道的基本概念及管道的创建

    一.IPC 概念 IPC: 进程间通信. 进程间通信的常见的 4 中方式: (1)管道 pipe fifo :最简单(但只能在有血缘关系下进行). (2)信号 signal : 属于系统的,所以系统开 ...

  9. Linux学习之系统编程篇:回收子线程资源

    子线程退出后,主控线程也是需要回收子线程资源的. 函数:pthread_ join 阻塞等待线程退出,获取线程退出状态函数说明: int pthread_join(pthread_t thread, ...

最新文章

  1. php和架构,结构和架构的区别是什么?
  2. 个人中心数据接口的开发
  3. Android判断软键盘弹出并隐藏的简单完美解决方案
  4. ViewState的使用
  5. (23)zabbix单位符号Unit symbols
  6. 每天一道LeetCode-----括号匹配
  7. Critical error detected c0000374
  8. gRPC in ASP.NET Core 3.x - gRPC 简介(2)
  9. property修饰关键字
  10. 700 页的机器学习总结火了!
  11. Javascript第六章JavaScript用new创建对象第一课
  12. r语言html爬虫,如何用R语言爬取网页中的表格
  13. LinkedHashMap随笔
  14. 代写python assignment经常用到的代码语法分享!
  15. linux赋权限2770,Linux权限:SUID,SGID以及粘滞位
  16. Linux7运维视频教程
  17. 《Zero to One》读书笔记
  18. js中new操作符到底干了什么?
  19. 51nod 1429 巧克力
  20. 使用源码部署CITA(Ubuntu18.0.4 | VMware)

热门文章

  1. 蒙特卡洛梯度估计方法(MCGE)简述
  2. CVPR 2019 | 旷视研究院提出ML-GCN:基于图卷积网络的多标签图像识别模型
  3. Floyd算法的动态规划本质
  4. JavaScript基础学习之强制类转换(二)
  5. MyBatis开发Dao的方法
  6. 操作云数据库出现Access denied for user ‘common_1‘@‘%‘ to database ‘seata_storage‘
  7. SpringMVC-自定义转换器
  8. 处女座和小姐姐(二)
  9. matlab raw函数,用matlab处理Raw格式的图像文件的方法
  10. tmux命令启动MySQL_tmux启动脚本