Linux平台中通过POSIX接口创建线程函数为:

#include <pthread.h>
int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,void *(*start_rtn)(void *),void *restrict arg);

想必大家对这个函数已经很熟悉了,这里就不多讲,这里主要讲一下start_rtn这个回调函数的返回值问题。

start_rtn的入参为arg。返回值为void *类型。因为之前不曾关心这个回调函数的返回值问题,所以也一直在回调函数末尾写一句return NULL。最近需要用到回调函数的返回值来做一些处理,所以这里也就记录一下。

我们知道线程创建执行时默认异步的过程(通过os调度什么时候创建、运行)。所以为了在调用线程中做同步,获取线程的执行结果,需要主线程中使用另一个接口来获取什么结果:

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

这里的retval可以为NULL,如果为NULL则不关心子线程执行结果,如果不是NULL则指向上面说到的回调函数start_run的返回值。为了更直观的理解,这里给一个最简单的例子:(Ubuntu14.04环境)

test.c

#include <stdio.h>
#include <pthread.h>void *cb_fn(void *arg) //线程回调函数
{printf("in cb_fn\n");return (void *)"OK";
}int main()
{int ret;void *retval;pthread_t pid;ret = pthread_create(&pid, NULL, cb_fn, NULL);if (ret < 0) {printf("pthread_create error, ret=%d\n", ret);return -1;}pthread_join(pid, &retval);printf("retval = %s\n", (char *)retval);return 0;
}

编译命令:

gcc test.c -lpthread

运行命令和结果:

#./a.out

in cb_fn

retval = OK

相信大家看到这里已经一目了然了,使用void *作为返回值,也标明这个返回值可以返回任何类型的数据,这样我们可以将需要的线程执行结果和状态放到返回值中,然后主线程就可以通过pthread_join来获取到然后作出相应的处理了。

ps:

pthread_join不关可以用来获取到子线程的退出结果装填,还将起到一个回收线程资源的作用。

有三种回收线程资源的方式:

1.主线程中使用pthread_join,如果不关心子进程执行结果,第二个参数用NULL。

2.子线程回调函数中开头处调用pthread_detach(pthread_self())。

3.主线程创建线程前设置detach属性,使用pthread_attr_setdetachstate,这样会多写两行代码:

pthread_attr_t attr;

pthread_t pid;

pthread_attr_init (&attr);

pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

pthread_create(&pid, &attr, thread_callback, thread_arg);

如有不对的地方,还请网友提出指教,谢谢!

转自:https://blog.csdn.net/lovefsyss/article/details/79269839

pthread_create回调函数返回值相关推荐

  1. Node.js express 之mongoose 从异步回调函数返回值,类似于同步

    http://my.oschina.net/antianlu/blog/187023 转载于:https://www.cnblogs.com/cylblogs/p/5192314.html

  2. 模板引擎不关心内容之——art-template,碰见的同步与fs.readFile异步以及函数回调问题的描述,针对fs的readfille读取文件时,返回不了异步函数返回值的解决方法

    模板引擎不关心内容 art-template art-template不仅可以在浏览器使用,也可以在node中使用 npm install art-template该命令在哪执行就会把包下载在哪里,默 ...

  3. 由JS函数返回值引发的一场”血案

    ---恢复内容开始--- 啊...  本来昨天晚上想写来着,结果陪老婆看电视剧就忘了... 呢滴神啊,原谅我吧. 背景:昨天在项目中做一个小功能的时候,出现了个小问题,而且一开始找了半天也没找到原因. ...

  4. ostream作为函数返回值_GO语言基础函数

    GO语言基础–函数 函数是组织好的.可重复使用的.用于执行指定任务的代码块.本文介绍了Go语言中函数的相关内容. 函数定义 Go语言中定义函数使用func关键字,具体格式如下: func 函数名(参数 ...

  5. C语言 const 修饰函数返回值 - C语言零基础入门教程

    目录 一.const 简介 1.const 修饰变量 2.const 修饰指针 二.const 修饰在函数名前面 三.const 修饰在函数名后面 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : ...

  6. java 定时器返回值_javascript 函数返回值(return)、定时器(setTimeout、setInterval)...

    一.函数的返回值:return 1.函数名+括号=return后面的值 function fn1(){ return 100; } alert(fn1()); // 100 fn1()=return后 ...

  7. C++ 笔记(15)— 引用(声明引用、引用作为参数、引用作为函数返回值、const 用于引用)

    引用是变量的别名.也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量. 1. 创建引用 要声明引用,可使用引用运算符 & ,如下面的 ...

  8. C++ 笔记(02)— 程序结构(头文件说明、命名空间、函数返回值、函数参数、注释、语句结束符、cin/cout)

    先看以下代码 #include <iostream> #include <string> using namespace std;int main() // main() 是程 ...

  9. C指针7:指针作为函数返回值

    C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数.下面的例子定义了一个函数 strlong(),用来返回两个字符串中较长的一个: #include <stdio.h> ...

最新文章

  1. 递归下降分析法(编译原理)
  2. Android Framework系统服务详解
  3. 大学期末考试SSH试题四
  4. RTA广告能力的应用场景剖析
  5. numpy 线性代数_数据科学家的线性代数—用NumPy解释
  6. 高速ETC劝大家不要抬杠:真文案鬼才!
  7. mysql同步多主,MySQL多主一从同步配置
  8. 【JavaAndroid开源库代码剖析】のandroid-smart-image-view
  9. java给xyz大小排序_Java Collection - 002 排序
  10. IDEA设置代码背景豆沙色
  11. 从含有数字的字符串中提取数字
  12. MATLAB相对声压分布彩图,矩形声化学反应器声场分布纵向共振研究
  13. 写一个函数,求三个数和的平均值。
  14. 练习4.圆中四只鸭子在同一个半圆的概率——MATLAB
  15. PWmat案例赏析:利用激光脉冲实现绝缘体-金属超快转变
  16. 【MySQL 数据库】JDBC 编程之 Java 连接 MySQL
  17. 如何不翻墙访问ChatGpt?
  18. 阿里云“无影”云电脑,究竟是不是桌面云?!
  19. 构建之法10,11,12章的读后感
  20. 二分类问题中的评价指标

热门文章

  1. Wujian100 SOC FPGA原型验证,bootrom的实现
  2. 矩阵论——逆、转置、置换
  3. 2019学UI设计就业前景如何
  4. 服务器接收不到信号,Windows上的子进程未接收到信号(SIGTERM)
  5. 神机百炼1.5-二分
  6. 什么是快乐星球?让我带你研究研究!
  7. DEDE添加迅雷下载地址的方法
  8. java对接ntlm,httpclient 实现自动登录NTLM 域验证(sso) .
  9. 微信登陆报redirect_uri 参数错误
  10. 介绍几种运动——匀速、加速、缓冲、弹性