一. pthread_create()

#include <pthread.h>

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

pthread_t *thread:           传递一个pthread_t变量地址进来,用于保存新线程的tid(线程ID)
const pthread_attr_t *attr:      
线程属性设置,如使用默认属性,则传NULL
void *(*start_routine) (void *):      
函数指针,指向新线程应该加载执行的函数模块
void *arg:            
指定线程将要加载调用的那个函数的参数

返回值:成功返回0,失败返回错误号。以前学过的系统函数都是成功返回0,失败返回-1,而错误号保存在全局变量errno中,而pthread库的函数都是通过返回值返回错误号,虽然每个线程也都有一个errno,但这是为了兼容其它函数接口而提供的,pthread库本身并不使用它,通过返回值返回错误码更加清晰。

二.pthread_join()

#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);

pthread_t thread:        回收线程的tid
void **retval:          接收退出线程传递出的返回值
返回值:成功返回0,失败返回错误号

注意:

调用该函数的线程将挂起等待,直到id为thread的线程终止。thread线程以不同的方法终止,通过pthread_join得到的终止状态是不同的,总结如下:

如果thread线程通过return返回,retval所指向的单元里存放的是thread线程函数的返回值。
如果thread线程被别的线程调用pthread_cancel异常终止掉,retval所指向的单元里存放的是常数PTHREAD_CANCELED。
如果thread线程是自己调用pthread_exit终止的,retval所指向的单元存放的是传给pthread_exit的参数。

如果对thread线程的终止状态不感兴趣,可以传NULL给retval参数。

三.pthread_exit()

#include <pthread.h>
void pthread_exit(void *retval);
void *retval:      线程退出时传递出的参数,可以是退出值或地址,如是地址时,不能是线程内部申请的局部地址。

注意和exit函数的区别,任何线程里exit导致进程退出,其他线程未工作结束,主线程退出时不能return或exit。需要注意,pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是用malloc分配的,不能在线程函数的栈上分配,因为当其它线程得到这个返回指针时线程函数已经退出了。

四.pthread_cancel()

#include <pthread.h>
int pthread_cancel(pthread_t thread);

定义在Linux的pthread库中常数PTHREAD_CANCELED的值是-1。可以在头文件pthread.h中找到它的定义:

#define PTHREAD_CANCELED ((void *) -1)

五.示例

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>void *thr_fn1(void *arg)
{printf("thread 1 returning\n");return (void*)1;
}void *thr_fn2(void *arg)
{printf("thread 2 exiting\n");pthread_exit((void*)2);
}void *thr_fn3(void *arg)
{while(1) {printf("thread 3 writing\n");sleep(1);}
}int main()
{pthread_t tid;void *retval;pthread_create(&tid, NULL, thr_fn1, NULL);pthread_join(tid, &retval);printf("thread 1 exit code %d\n", (int)retval);    pthread_create(&tid, NULL, thr_fn2, NULL);pthread_join(tid, &retval);printf("thread 2 exit code %d\n", (int)retval);pthread_create(&tid, NULL, thr_fn3, NULL);sleep(3);// 调用pthread_cancel函数取消第三个线程
    pthread_cancel(tid);// 如果线程是通过pthread_cancel异常终止掉,retval所指向的单元里存放的是常数PTHREAD_CANCELEDpthread_join(tid, &retval);printf("thread 3 exit code %d\n", (int)retval);return 0;
}

运行结果:

thread 1 returning
thread 1 exit code 1
thread 2 exiting
thread 2 exit code 2
thread 3 writing
thread 3 writing
thread 3 writing
thread 3 exit code -1

转载于:https://www.cnblogs.com/yongdaimi/p/8257655.html

线程相关函数(1)-pthread_create(), pthread_join(), pthread_exit(), pthread_cancel() 创建取消线程...相关推荐

  1. 【Java 并发编程】线程池机制 ( 线程池执行任务细节分析 | 线程池执行 execute 源码分析 | 先创建核心线程 | 再放入阻塞队列 | 最后创建非核心线程 )

    文章目录 一.线程池执行任务细节分析 二.线程池执行 execute 源码分析 一.线程池执行任务细节分析 线程池执行细节分析 : 核心线程数 101010 , 最大小成熟 202020 , 非核心线 ...

  2. 线程安全list_多线程开发之如何创建一个线程安全的类

    上一篇讨论了如何解决线程安全的问题,今天总结如何设计一个线程安全的类: 创建线程安全类的关注点 一个类要想线程安全,除了上一篇文章通过外部解决方式外,还可以通过合理的设计类的内部来解决,使类本身就线程 ...

  3. boost创建线程池_Java并发 之 线程池系列 (1) 让多线程不再坑爹的线程池

    目录 背景 线程池的来由 什么是线程池 背景总结 用法 通过Executors创建线程池 Executors及其服务的类 Executors常用的几个方法 一个线程池的例子 任务 池子 测试 说明 总 ...

  4. Executors源码解读——创建ExecutorService线程池

    Executors源码解读--创建ExecutorService线程池 〇.[源码版本] jdk 1.8 一.线程池概述 二.线程池创建 三.Executors源码解读 newFixedThreadP ...

  5. 操作系统(3)-线程的六大状态、基于代码实战的线程创建及六个常用方法

    一.进程和线程的简介 进程的概念 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 进程中所包含的一个或多个执行单元成为线程.进程还拥有一个私 ...

  6. Handler之创建子线程Handler

    Handler之创建子线程Handler Android的消息机制实现步骤: ①创建当前线程的looper ②创建当前线程的handler ③调用当前线程looper的loop方法 要实现创建子线程H ...

  7. C#线程间操作无效:从不是创建控件“textbox1”的线程访问它

    在C#的多线程访问中,在线程间的相互访问时因为线程安全问题有访问限制,在创建一般线程时,对于界面元素访问时这样的问题比较常见. 比如,创建一个form1,上面放置一个textbox控件,创建一个线程去 ...

  8. python创建多线程_Python 多线程,threading模块,创建子线程的两种方式示例

    本文实例讲述了Python 多线程,threading模块,创建子线程的两种方式.分享给大家供大家参考,具体如下: GIL(全局解释器锁)是C语言版本的Python解释器中专有的,GIL的存在让多线程 ...

  9. java线程池应用的好处_java高级应用:线程池全面解析

    什么是线程池? 很简单,简单看名字就知道是装有线程的池子,我们可以把要执行的多线程交给线程池来处理,和连接池的概念一样,通过维护一定数量的线程池来达到多个线程的复用. 线程池的好处 我们知道不用线程池 ...

最新文章

  1. IDEA下找不到diagrams按钮选项的解决方案
  2. (论坛答疑点滴)为什么设置了DropDownList的AutoPostBack=True还是不能触发SelectedIndexChanged事件?...
  3. C语言读写配置文件--转载
  4. python怎么安装requests库-python怎么安装requests库
  5. 图书商城:购物车模块
  6. CodeForces - 1350D Orac and Medians(思维)
  7. 获“CAIS紫金奖”,腾讯民汉翻译践行“科技向善”
  8. 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
  9. 十二生肖swift1.2
  10. Visual Studio 安装OpenCV及问题总结
  11. python 面向对象oop
  12. 自考计算机哪个简单,自考哪个专业好考?
  13. creo JAVA,Creo JAVA二次开发全套视频教程
  14. 充电器input与output_变频器input和output的区别?
  15. 华三交换机ping不通用户但用户_h3c交换机如何一直 ping【已解决】
  16. 自动化测试:Selenium原理及安装教程
  17. 批量生成insert语句的方法(word转excel,excel用公式生成insert)
  18. 从C到C++ 番外const的用法
  19. R语言小实践---云词分析
  20. EChat(简易聊天项目)六、实现记住密码和自动登录

热门文章

  1. .net系统自学笔记——数组
  2. 用CSS3实现图像风格
  3. TypeScript泛型详解
  4. ES6——函数的name属性
  5. 【Vue2.0】—Vue监视数据的原理(五)
  6. java 缓冲流 刷新_java – 缓冲和刷新Apache Beam流数据
  7. 35岁的程序员如果不转行,从事哪些细分行业比较好?
  8. 股票收市前三分钟下单有效吗?
  9. 固收基金可以长期持有吗?
  10. 进大学时高考成绩是班里第一,同样也是努力学习,为什么大学时做不到第一了呢?