引言

通过几个实验练习,学习线程之间连接的具体实现。下面列举了两个例子,一个是子线程返回简单数据类型;另一个是子线程返回复杂数据类型。

实现代码

子线程返回简单的数据类型

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
// int a=20;
void* ThreadEntry(void*arg)
{int count=0;// int a=20;// int*p=&a;int *p=(int*)malloc(sizeof(int)); *p=10;while(1){++count;if(count>=5)pthread_exit(p);printf("I am thread\n");sleep(1);}
}int main()
{pthread_t threadId;void *ret;int error;error=pthread_create(&threadId, NULL, ThreadEntry, NULL);if(error){printf("Thread create error!\n");exit(1);}printf("I am main\n");pthread_join(threadId, &ret);printf("ret=%d\n", *(int*)ret);return 0;
}

注意

当在子线程调用作为参数的函数中使用int a = 20; int *p = &a;这种方式,将会导致输出的ret是一个不确定的值,这是因为p指向了一个局部变量,当函数调用结束该变量就会被释放,造成指针悬挂。
所以需要采用全局变量或动态分配的方式解决这个问题。当p指向了一个全局变量,虽然子线程调用结束,但是返回的指针所指向的内存区域未被释放;当p指向了一个动态分配的存储空间的,保证了返回的指针所指向的内容对应的内存空间不会因为子线程的结束而被释放,从而得到预期结果。

pthread_exit()

  • 功能:终止线程
  • 函数声明:
    void pthread_exit(void *value_ptr)
  • 参数说明:
    value_ptr:不要指向一个局部变量

要结束一个线程,只需要在线程调用的函数中加入 pthread_exit(X) 即可,但有一点需要特别注意:如果一个线程是非分离的(默认情况下创建的线程都是非分离)并且没有对该线程使用 pthread_join() 的话,该线程结束后并不会释放其内存空间。这会导致该线程变成了“僵尸线程”。“僵尸线程”会占用大量的系统资源,因此我们要避免“僵尸线程”的出现。

pthread_join()

  • 功能 :pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。
  • 头文件 : #include <pthread.h>
  • 函数声明:int pthread_join(pthread_t thread, void **retval);
  • 参数说明:thread: 线程标识符,即线程ID,标识唯一线程。retval: 用户定义的指针,用来存储被等待线程的返回值。
    返回值 : 0代表成功,非0是失败。

最后

  • 由于博主水平有限,难免有疏漏之处,欢迎读者批评指正!

Linux多线程编程-线程函数返回值(返回简单数据类型)相关推荐

  1. Linux多线程编程---线程间同步(互斥锁、条件变量、信号量和读写锁)

    本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了 ...

  2. linux线程 ppt,Linux多线程编程多核编程.ppt

    <Linux多线程编程多核编程.ppt>由会员分享,可在线阅读,更多相关<Linux多线程编程多核编程.ppt(28页珍藏版)>请在装配图网上搜索. 1.Linux多线程编程, ...

  3. 多核程序设计 linux,多核程序设计Linux多线程编程.ppt

    Linux多线程编程,IEEE POSIX 标准 p1003.1c (Pthreads) 定义了处理线程的一系列C 语言类型的API. 在Linux中,线程一般被认为是"轻量级的进程&quo ...

  4. Linux 多线程编程(实现生产者消费者模型)

    Linux 多线程编程 线程分类 线程按照其调度者可以分为用户级线程和内核级线程两种. 内核级线程 在一个系统上实现线程模型的方式有好几种,因内核和用户空间提供的支持而有一定程度的级别差异.最简单的模 ...

  5. c/c++ Linux多线程编程

    Linux多线程编程 线程概念 线程是指运行中的程序的调度单位.一个线程指的是进程中一个单一顺序的控制流,也被称为轻量级线程.它是系统独立调度和分配的基本单位.同一进程中的多个线程将共享该系统中的全部 ...

  6. linux查询某域线程是否满了,Linux多线程编程的时候怎么查看一个进程中的某个线程是否存活...

    pthread_kill: 别被名字吓到,pthread_kill可不是kill,而是向线程发送signal.还记得signal吗,大部分signal的默认动作是终止进程的运行,所以,我们才要用sig ...

  7. 函数的返回值返回概念

    函数的返回值返回值概念 函数自身的处理数据或执行结果,需要被二次使用或其他程序调用时,需要将数据返回出来 如何拿到返回值 关键字:return 要返回的数据 return的功能 可以让函数返回指定的值 ...

  8. Linux 多线程编程

    这篇文章总结下 Linux 中多线程编程中能用到的几个函数,当然,需要同步操作的时候还需要加锁的操作,这里,没有列举的这么具体,只是把最常用的函数介绍下. 在编写多线程程序在编译的时候需要加上 -lp ...

  9. 3、Linux多线程,线程同步(转)

    3.Linux多线程,线程同步 5)线程私有数据 进程内的所有线程共享进程的数据空间,因此全局变量为所有线程所共有.但有时线程也需要保存自己的私有数据,这时可以创建线程私有数据(Thread-spec ...

最新文章

  1. 2021年大数据Kafka(十二):❤️Kafka配额限速机制❤️
  2. numpy.transpose()方法的使用,该方法其实并没有改变数据的几何位置,只是取数据的角度不同
  3. 68页PPT,读懂中、美、德三国智能制造战略!
  4. 简化管理面向服务的应用程序的创建
  5. 【汇总】涉及iOSiPhone开发相关文章汇总
  6. 单片机原理及其应用——单片机定时器中断实验(八段数码管依次显示0~9数字)
  7. java泛型程序设计——注意擦除后的冲突
  8. 传统关系型数据库性能优化全攻略
  9. Linux能ping主机,但ping不了网关以及外网,显示包全丢失解决方案
  10. sg90舵机c语言编程,浅谈用单片机控制SG90舵机(原理+编程)
  11. 名词用作动词举例_名词作动词的句子
  12. C语言——输出一个正方形
  13. 计数器函数 php,PHP用函数嵌入网站访问量计数器
  14. 用友系统中连接数据库服务器失败,用友u8服务器连接不到本地数据库
  15. think php 5(命令行)创建控制器、model
  16. java画板_java 画板画图程序
  17. 哈夫曼树【北邮机试】
  18. iOS/Android 纪念模式(黑白灰模式) 记录
  19. Redis --- 超级详细
  20. 短信接口防刷,限制IP的访问 部分笔记!

热门文章

  1. MySql单张表中,“多个唯一字段”的插入和更新操作----添加联合唯一索引,Navicat上操作
  2. sharepoint 2016 学习系列篇(1)-关于sharepoint
  3. activiti工作流在线表单设计功能(activiti + ueditor + Ueditor Web Form De
  4. OSChina 周四乱弹 ——心有鱼,而力不足
  5. 基于SSM架构的新闻管理系统设计与实现论文
  6. vs2019添加DevExpress
  7. MySQL运行存储过程出现1292错误
  8. Proteus软件下载安装(包含win10安装proteus8.0+报错问题解决)
  9. Citrix 桌面云 XenApp_XenDesktop_7.15 部署系列(七)准备虚拟机模板
  10. 立体声混音没有声音_如何录制来自PC的声音(即使没有立体声混音)