【问题标题】:Pass the argv and argc to thread将 argv 和 argc 传递给线程
【发布时间】:2014-01-31 15:03:50
【问题描述】:

我的程序从用户那里接收参数

int main(int argc, char *argv[])

我在某个线程中有这个函数(我不能改变这个函数):

func(&argc, &argv);

如您所见,我需要调用线程,并在该线程内部使用这些参数调用func。 我看到有一种方法可以用 struct 向线程发送多个参数。

这个结构应该是什么样子的?以及如何将这些参数复制到结构中?

【问题讨论】:

  • struct Args { int argc; char *argv[]; }; ?

标签: c++ c pthreads parameter-passing


【解决方案1】:
struct arg_holder {
    int argc;
    char ** argv;
};

void * thread_caller(void * arg) {
    struct arg_holder arg_struct = *(struct arg_holder *)arg;
    free(arg);
    return func(arg_struct->argc, arg_struct->argv);
}

main:

struct arg_holder * arg_struct = malloc(sizeof(*arg_struct));
arg_struct->argc = argc;
arg_struct->argv = argv;

pthread_create(&thread_id, NULL, thread_caller, arg_struct);

【讨论】:

  • 嗨!感谢 ypou 的评论,但是在调用 fuc 时它给了我错误:TCPserver.c:136:23: error: invalid type argument of '->' (have 'struct multiple_var') TCPserver.c:136:40: error : '->' 的无效类型参数(有 'struct multiple_var')
  • thread_caller 的第一行应该是:struct arg_holder * arg_struct = (struct arg_holder *)arg;
  • @DavidLaPorte 我故意将参数持有者struct 复制到堆栈上。这样我可以立即释放动态内存并返回被调用函数的返回值。这允许尾调用编译器优化。
  • 啊,对。那么返回语句应该是arg_struct.argc, arg_struct.argv,对吧? ('.' 而不是 '->')
【解决方案2】:

想提一下,AFAIK,您可以将命令行参数传递给线程而不复制它们(即 - 使用 malloc 创建包含它们的专用结构),因为命令行参数的生命周期是提供给它们的进程(主要)的生命周期。

干杯,

伙计。

【讨论】:

    猜你喜欢
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 2011-04-15
    • 2012-04-20
    • 1970-01-01
    相关资源
    最近更新 更多