pthread_create回调函数返回值

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

#include 
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 

       int pthread_join(pthread_t thread, void **retval);

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

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);
如有不对的地方,还请网友提出指教,谢谢!


你可能感兴趣的:(linux)