pthread_create回调函数返回值
Linux平台中通过POSIX接口创建线程函数为:#include <pthread.h>int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,void *(*start_rtn)(void...
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);
如有不对的地方,还请网友提出指教,谢谢!
更多推荐
所有评论(0)