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

Logo

更多推荐