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. 1011.Django状态保持以及表单

    一.session保持状态 状态保持: 1. http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态: 2. 客户端与服务器端的一次通信,就是一次会话实现状态保持的方式:在客户端或服 ...

  2. bigNumber.js的简单使用

    sum 计算传入的参数和,参数类型可以是 String,Number // 两数之和 var x = BigNumber.sum('11', 23) x.toNumber() // 34 // 多个参 ...

  3. C Ⅸ

    数组例子:统计个数  #include <stdio.h> ​ int main(void) {     int x;     int count[10];     int i;      ...

  4. liunx 目录详解

    /etc/sysconfig/network-scripts/ifcfg-eth0  第一块网卡的配置文件 /etc/sysconfig/network    主机名配置文件 /etc/profile ...

  5. 前端复习之jQuery大全

    Jquery知识点梳理 梳理图摘自--https://www.cnblogs.com/859630097com/p/14433611.html [手机版]横屏观看,效果更佳 JavaScript类库: ...

  6. SqlServer提示对象名无效

    执行脚本 exec sp_msforeachtable "sp_changeobjectowner '?','dbo'"

  7. python-实现动态web服务器

    # encoding=utf-8 import socket from multiprocessing import Process import re import sys # 设置静态文件根目录 ...

  8. linux 修改文件内容命令

    1.进入文件:vim 文件名 eg #vim /etc/httpd/httpd.conf 2.查找待修改内容位置 : (1)shift+":",使文件变成可查询状态 (2)输入 / ...

  9. python-魔法函数-__str__ __repr__ 的一次异常

    # encoding: utf-8import loggingERROR_NOT_FOUNDED_FILE = "error_not_founded_file"class Gene ...

  10. 2022年8月学科能力综合测试(TACA)试题解答 Mathemaitca练习

    目录 试题地址 1 4 5 10 13 你让我猜我肯定这么猜 试题地址 https://k.sina.com.cn/article_2897328623_acb1b9ef019011qen.html ...