linux高级编程之线程间的通信(pthread_exit()和pthread_join())

1.线程终止
     如果进程中的任一线程调用了exit、_Exit或者_exit,那么整个进程就会终止。与此类似,如果信号的默认动作是终止进程,那么,把该信号发送到线程会终止整个进程。
       单个线程可以通过下列三种方式退出,在不终止整个进程的情况下停止它的控制流。
       ●线程只是从启动例程中返回,返回值是线程的退出码。
       ●线程可以被同一进程中的其他线程取消
       ●线程调用pthread_exit()
        pthread_exit()函数
        头文件:#include <pthread.h>
        函数原型:void pthread_exit(void *rval_ptr);
        rval_ptr:是一个无类型指针,与传给启动例程的单个参数类似进程中的其他线程可以通过调用pthread_join()函数访问到这个指针。
        pthread_join()函数
        头文件:#include <pthread.h>
        函数原型:int pthread_join(pthread_t  thread,void **rval_ptr);
        thread:线程描述符
        返回值:若成功为0,否则返回错误编码
        功能:调用线程将一直阻塞,直到指定的线程调用pthread_exit,从启动例程中返回或者被取消,如果线程只是从它的启动例程返回,rval_ptr将包含返回码。如果线程被取消,由rval_ptr指定的内存单元就置为PTHREAD_CANCELED.
        ● 我们可以通过调用pthread_join自动把线程至于分离状态,这样资源就可以恢复,如果线程已经处于分离状态,pthread_join调用就会失败,返回EINVAL。
        ● 如果对线程的返回值并不感兴趣,可以把rval_ptr置为NULL,在这种情况下,调用pthread_join函数将等待指定线程终止,但并不获取线程的终止状态。
        接下来是关于使用pthread_exit()和pthread_join()函数的简单例子

#include <stdio.h>
#include <pthread.h>
void error(char *s)
{
printf("%s",s);
}
void *fun1(void *arg)
{
printf("thread 1 returning\n");
return (void *)1;
}
void *fun2(void *arg)
{
printf("thread 2 returning\n");
pthread_exit((void *)2);
}
int main()
{
int err;
pthread_t tid1,tid2;
void *tret;
err = pthread_create(&tid1,NULL,fun1,NULL);
if(err != 0)
{
error("create thread 1 failure\n");
return -1;
}
err = pthread_create(&tid2,NULL,fun2,NULL);
if(err != 0)
{
error("create thread 2 failure\n");
return -2;
}
err = pthread_join(tid1,&tret);
pthread_cancel(tid1);
if(err != 0)
error("can't join with thread 1\n");
printf("thread 1 exit code %d\n",tret);
err = pthread_join(tid2,&tret);
if(err != 0)
error("can't join with thread 2\n");
printf("thread 2 exit code %d\n",tret); return 0;
}

运行结果如下:

      

       可以看出,当一个线程通过调用pthread_exit退出或者简单的从启动例程中返回时,进程中的其他线程可以通过调用pthread_join函数获得该线程的退出状态。另外也能看出,我执行了两次,从打印信息看出,线程运行是不分先后的,可能线程1先运行,也可能线程2先运行。
       
注意:pthread_create()和
pthread_exit()函数的无类型指针参数能传递的数值可以不止一个,该指针可以传递包含更复杂信息的结构的地址,但是注意这个结构所使用的内存在调用者完成调用以后必须仍然是有效的,否则就会出现无效或者非法内存访问。
     

笔记十:线程间的通信(pthread_exit()和pthread_join())的更多相关文章

  1. iOS开发多线程篇—线程间的通信

    iOS开发多线程篇—线程间的通信 一.简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任 ...

  2. Java核心知识点学习----多线程并发之线程间的通信,notify,wait

    1.需求: 子线程循环10次,主线程循环100次,这样间隔循环50次. 2.实现: package com.amos.concurrent; /** * @ClassName: ThreadSynch ...

  3. java多线程详解(6)-线程间的通信wait及notify方法

    Java多线程间的通信 本文提纲 一. 线程的几种状态 二. 线程间的相互作用 三.实例代码分析 一. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种:(1). 产生(New) ...

  4. iOS边练边学--多线程NSOperation介绍,子类实现多线程的介绍(任务和队列),队列的取消、暂停(挂起)和恢复,操作依赖与线程间的通信

    一.NSOperation NSOperation和NSOperationQueue实现多线程的具体步骤 先将需要执行的操作封装到一个NSOperation对象中 然后将NSOperation对象添加 ...

  5. 新建线程与UI线程间的通信

    现在用一个实例来演示一下自己的新建线程与UI线程间的通信. UI界面包含3个控件: 一个输入框,用来输入数字: 一个显示框,用来显示从2开始,到输入数字之间的所有质数: 一个按钮,点击后获取输入框输入 ...

  6. C# 线程间互相通信

    C#线程间互相通信主要用到两个类:AutoResetEvent和ManualResetEvent. 一.AutoResetEvent AutoResetEvent 允许线程通过发信号互相通信,线程通过 ...

  7. QThread与其他线程间相互通信

    转载请注明链接与作者huihui1988 QThread的用法其实比较简单,只需要派生一个QThread的子类,实现其中的run虚函数就大功告成, 用的时候创建该类的实例,调用它的start方法即可. ...

  8. Handler不同线程间的通信

    转http://www.iteye.com/problems/69457 Activity启动后点击一个界面按钮后会开启一个服务(暂定为padService),在padService中会启动一个线程( ...

  9. Java多线程中线程间的通信

    一.使用while方式来实现线程之间的通信 package com.ietree.multithread.sync; import java.util.ArrayList; import java.u ...

  10. C# 线程间互相通信 AutoResetEvent和ManualResetEvent

    C#线程间互相通信主要用到两个类:AutoResetEvent和ManualResetEvent. 一.AutoResetEvent AutoResetEvent 允许线程通过发信号互相通信,线程通过 ...

随机推荐

  1. c/s winForm框架 tabpage标签切换窗体

    /// <summary> /// 根据窗体Name打开窗体 /// </summary> /// <param name="name">< ...

  2. flowable初体验踩坑及概述

    遵守bpmn2.0协议(前提)(还在找比较好用的绘图工具) 可以使用idea插件进行绘图保存成xml进行改造编写 Flowable BPMN visualizer和JBoss jBPM , 暂时使用的 ...

  3. 2.Vue模板语法

    1.模板语法的概述 (1)如何理解前端渲染 将数据填充到HTML标签中,生成静态的HTML内容 2.前端渲染方式 (1)原生JS拼接字符串 (2)使用前端模板引擎 (3)使用Vue特有的模板语法 3. ...

  4. Halcon代码导出到.net FrameWork/WPF

    1. 应用背景 在工业项目中,往往需要使用机器视觉结合人机界面开发特定的,面向工艺的项目.机器视觉中,Halcon无疑是功能强大的,能快速应用到项目的视觉产品,而WPF则是解决人机界面的利器.因此了解 ...

  5. AE|蒙版、遮罩、轨道遮罩全面解析

    相信很多初学者都有这样的困惑,搞不清蒙版和遮罩这两个概念的区别,甚至有的人认为它们就是一个东西. 这两个看似一样的概念,其实是有很大的区别的,今天主要从定义和作用方式这两个方面进行解析,相信对各位认识 ...

  6. Adams:一种使接触力(力矩等等)失效的方法

    1 第一步:点击"运行脚本". 2 第二步:右击选择"仿真脚本",点击"创建". 3 第三步:选择"脚本类型"为&quo ...

  7. Boost.Asio C++ 网络编程

    在线电子书:https://mmoaay.gitbooks.io/boost-asio-cpp-network-programming-chinese/content/Chapter1.html

  8. Vue的官方脚手架 Vue-cli 安装使用解析

    ------------恢复内容开始------------ 1.首先什么是vue-cli 可以知道Vue-cli是一个官方提供的脚手架,主要作用是用来快速搭建Vue的项目模板,可以预先定义好项目的结 ...

  9. HTTP通信基础

    1. HTTP通信流程: 1)输入www.baidu.com2)解析成IP地址:192.168.0.13)浏览器通过该IP访问web服务器获取web资源4)再返回给客户端5)最后呈现在用户面前 2.  ...

  10. 07-Spring的事务处理

    Spring中提供了七种事务的传播行为: PROPAGATION_REQUIRED:默认值,最常用,统一事务,出现异常,全部回滚 其余参考Spring事务处理word文档. 0.原转账业务(不含事务处 ...