【问题标题】:Return Value of a pthread_createpthread_create 的返回值
【发布时间】:2010-08-27 02:44:52
【问题描述】:

我正在尝试拨打以下电话,

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

schedule_sync 返回一个值,我希望能够获取该值,但是从我读到的有关 pthread_create 的内容中,您应该传递一个“void”函数。是否可以获取 schedule_sync 的返回值,还是我将不得不修改某种传入的参数?

感谢您的帮助!

【问题讨论】:

  • 您还应该为启动例程传递一个参数(在您的情况下为schedule_sync)。请参阅此示例 amparo.net/ce155/thread-ex.html 。您可以使用这两个参数 sch 和 t1 创建一个结构

标签: c pthreads


【解决方案1】:

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。我仍在尝试弄清楚您是否可以从传递的函数中获得“返回”值。
  • 所以这可能是由于我的知识有限,但是如果一个函数是无效的,它可以“返回”args吗?我也想我有点明白你要去哪里了,如果我可以将代码按摩成类似的形式,它看起来会起作用,只是为了确保我理解我阅读它的方式通过调用线程传入的函数,(即确保一个人立即完成一些工作,而不是处理器占用“main”上的所有时间)
  • @onaclov:它根本不是void,它返回一个void*,它可以与任何指针类型相互转换。 pthead_join 不对优先级进行操作,它只是等到另一个线程完成并给你它的返回值。
  • 你不需要使用显式的“&”来获取函数的地址;编译器会帮你做的。
  • @Daniel True,但无论如何都需要重写,而且明确性通常是更好的风格。
【解决方案2】:

为了在父(读作主)线程中捕获子线程的返回值。

你必须:

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 后加入子线程:

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 */

主要功能: 子线程执行完成后,可以在主线程中从 "*(valid typecast *) *p_ret_val_of_child_thread" 中获取它的返回值

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

【讨论】:

  • 试图格式化你的代码(不是很成功;-)请编辑和改进
  • 非常感谢!这里的第一个计时器,时间不多了,无法一次检查所有选项 :-)
【解决方案3】:

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 打败了我。
猜你喜欢
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多