pthread_create回调函数返回值
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回调函数返回值相关推荐
- Node.js express 之mongoose 从异步回调函数返回值,类似于同步
http://my.oschina.net/antianlu/blog/187023 转载于:https://www.cnblogs.com/cylblogs/p/5192314.html
- 模板引擎不关心内容之——art-template,碰见的同步与fs.readFile异步以及函数回调问题的描述,针对fs的readfille读取文件时,返回不了异步函数返回值的解决方法
模板引擎不关心内容 art-template art-template不仅可以在浏览器使用,也可以在node中使用 npm install art-template该命令在哪执行就会把包下载在哪里,默 ...
- 由JS函数返回值引发的一场”血案
---恢复内容开始--- 啊... 本来昨天晚上想写来着,结果陪老婆看电视剧就忘了... 呢滴神啊,原谅我吧. 背景:昨天在项目中做一个小功能的时候,出现了个小问题,而且一开始找了半天也没找到原因. ...
- ostream作为函数返回值_GO语言基础函数
GO语言基础–函数 函数是组织好的.可重复使用的.用于执行指定任务的代码块.本文介绍了Go语言中函数的相关内容. 函数定义 Go语言中定义函数使用func关键字,具体格式如下: func 函数名(参数 ...
- C语言 const 修饰函数返回值 - C语言零基础入门教程
目录 一.const 简介 1.const 修饰变量 2.const 修饰指针 二.const 修饰在函数名前面 三.const 修饰在函数名后面 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : ...
- java 定时器返回值_javascript 函数返回值(return)、定时器(setTimeout、setInterval)...
一.函数的返回值:return 1.函数名+括号=return后面的值 function fn1(){ return 100; } alert(fn1()); // 100 fn1()=return后 ...
- C++ 笔记(15)— 引用(声明引用、引用作为参数、引用作为函数返回值、const 用于引用)
引用是变量的别名.也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量. 1. 创建引用 要声明引用,可使用引用运算符 & ,如下面的 ...
- C++ 笔记(02)— 程序结构(头文件说明、命名空间、函数返回值、函数参数、注释、语句结束符、cin/cout)
先看以下代码 #include <iostream> #include <string> using namespace std;int main() // main() 是程 ...
- C指针7:指针作为函数返回值
C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数.下面的例子定义了一个函数 strlong(),用来返回两个字符串中较长的一个: #include <stdio.h> ...
最新文章
- 递归下降分析法(编译原理)
- Android Framework系统服务详解
- 大学期末考试SSH试题四
- RTA广告能力的应用场景剖析
- numpy 线性代数_数据科学家的线性代数—用NumPy解释
- 高速ETC劝大家不要抬杠:真文案鬼才!
- mysql同步多主,MySQL多主一从同步配置
- 【JavaAndroid开源库代码剖析】のandroid-smart-image-view
- java给xyz大小排序_Java Collection - 002 排序
- IDEA设置代码背景豆沙色
- 从含有数字的字符串中提取数字
- MATLAB相对声压分布彩图,矩形声化学反应器声场分布纵向共振研究
- 写一个函数,求三个数和的平均值。
- 练习4.圆中四只鸭子在同一个半圆的概率——MATLAB
- PWmat案例赏析:利用激光脉冲实现绝缘体-金属超快转变
- 【MySQL 数据库】JDBC 编程之 Java 连接 MySQL
- 如何不翻墙访问ChatGpt?
- 阿里云“无影”云电脑,究竟是不是桌面云?!
- 构建之法10,11,12章的读后感
- 二分类问题中的评价指标