pthread_create 的返回值是什么?

6

我正在尝试进行以下调用:

PID = pthread_create(&t, NULL, schedule_sync(sch,t1), NULL);

schedule_sync返回一个值,我想能够获取这个值,但是从我读过的关于pthread_create的内容来看,你应该传递一个“void”函数。是否可能获取schedule_sync的返回值,或者我需要修改传入的某个参数?

谢谢帮助!


1
此外,您还应该为启动例程(在您的情况下是schedule_sync)传递一个参数。请参考以下示例:http://www.amparo.net/ce155/thread-ex.html。您可以创建一个包含这两个参数sch和t1的结构体。 - Kamal
3个回答

6

pthread_create返回一个<errno.h>代码。它不会创建新进程,因此没有新的PID。

要传递指向函数的指针,请使用&取其地址。

pthread_create需要一个形式为void *func( void * )的函数。

因此,假设schedule_sync是线程函数,

struct schedule_sync_params {
    foo sch;
    bar t1;
    int result;
    pthread_t thread;
} args = { sch, t1 };

int err = pthread_create( &args.thread, NULL, &schedule_sync, &args );
 .....

schedule_sync_params *params_ptr; // not necessary if you still have the struct
err = pthread_join( args.thread, &params_ptr ); // just pass NULL instead
 .....

void *schedule_sync( void *args_v ) {
   shedule_sync_params *args = args_v;
   ....
   args->result = return_value;
   return args;
}

抱歉,schedule_sync是gridlabd项目的一部分,我也刚注意到PID是该函数返回的一个不好的名称,我只是在检查是否创建了PID(代码后面)。我知道线程是&t,我需要再调用另一个函数才能获取实际的pid。我仍在努力弄清楚是否可以从传递的函数中获取“返回”值。 - onaclov2000
因为我的知识有限,可能会出现这种情况,如果一个函数是void,它能否“返回”args?同时,我觉得我有点明白你的意思,如果我可以将代码调整为类似的形式,那么它看起来似乎可以工作,只是为了确保我正确理解它的方式,我读到pthread_join的意思实质上是给传递进来的函数优先级高于调用线程(即确保其中一个立即开始工作,而不是处理器占用所有时间在“主”上)。 - onaclov2000
1
@onaclov:这里并不是 void,而是返回一个可转换成任何指针类型的 void*pthead_join 不涉及优先级操作,它只是等待其他线程完成并返回其返回值。 - Potatoswatter
您不需要使用显式的“&”来获取函数的地址;编译器会为您完成这个操作。 - Daniel
@Daniel 确实,但那个需要重写,而且显式通常是更好的风格。 - Potatoswatter

3
为了在父线程(也称为主线程)中捕获子线程的返回值,您需要执行以下操作:
1)将子线程与主线程合并。这样主线程会停留并等待子线程完成其工作并退出。
2)在退出时捕获子线程的返回值。子线程应该调用pthread_exit(&ret_val),其中ret_val包含函数(子线程正在执行的函数)的退出值。
信息:
int pthread_join(pthread_t thread, void **rval_ptr);

void pthread_exit(void *rval_ptr);

说明:

*主要功能:*

在调用pthread_create创建子线程后,使用join来等待子线程结束:

pthread_join(thread_id, (void**)&(p_ret_val_of_child_thread));

子线程处理函数:

  ret_val_of_child_thread = 10;

  pthread_exit(&ret_val_of_child_thread);
  } /* Child Thread Function Handler Ends */

主要功能:在子线程完成执行后,可以通过“*(有效类型转换*) *p_ret_val_of_child_thread”从主线程中捕获其返回值。

pthread_join的第二个参数保存子线程函数处理程序退出值的返回值。


尝试对你的代码进行格式化(效果不太好;-) 请编辑和改进。 - kleopatra
非常感谢!我是第一次尝试,时间不够,无法一次性检查所有选项 :-) - Edy

1

schedule_sync 应该返回 void* 类型,它可以是任何类型。你可以使用 pthread_join 获取该值。

//Function shoulde be look like this
void* schedule_sync(void* someStructureWithArguments);

//Call pthread_create like so
pthread_create(&t, NULL, schedule_sync, locationOfSomeStructureWithArguments);

当线程终止时

pthread_joint(&t, locationToPutReturnValue);

暂时没有开发环境,所以我现在无法给你精确的顺序,但这应该能帮助你入门。


看起来 Potatoswatter 比我先做到了。 - Dennis Miller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接