首页 > 解决方案 > Ubuntu Linux中是否存在可以使子线程直接读取主线程的cmd参数的系统调用?

问题描述

最近我在做我的并行编程练习,这让我对参数发送的问题感到好奇。众所周知,我们可以使用函数 pthread_create 创建一个子线程,该子线程可以执行提到 pthread_create 参数的函数,就像参数发送一样,但是如果我想发送更多参数,我必须定义一个全局结构体。我想知道它非常复杂,是否有系统调用可以快速将这些参数直接传递给子线程?

标签: linuxpthreadssystem-calls

解决方案


传递给主函数的参数也可以传递给线程函数。不,有系统调用可以做到这一点。

它并不像你想象的那么复杂。

一个简单的程序:

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>

struct cmd_args
{
    int argc;
    char **argv;
};

void *thread_func(void *t)
{
    struct cmd_args *args = t;

    for (int i = 1; i < args->argc; ++i)
        printf(" arg[%d] = %s\n", i, args->argv[i]);

    return NULL;
}

int main(int argc, char *argv[])
{
    struct cmd_args args = {.argc = argc, .argv = argv };

    pthread_t tid;
    pthread_create(&tid, NULL, thread_func, &args);

    pthread_join(tid, NULL);
}

这是基于两个前提。

  1. 您的线程函数不会修改argv(如果存在多个线程并且它们都想修改)
  2. 主线程等待线程函数完成后退出

如果这不合适,您可以简单地复制 argv 并将其传递给线程。例如,您可以执行以下操作为每个线程制作如下副本:

(为简洁起见,省略了错误检查)

struct cmd_args *p = malloc(sizeof *p);
p->argc = argc;
p->argv = malloc(argc * sizeof(char*));
for (int i = 0; i < argc; ++i)
    p->argv[i] = strdup(argv[i]);

并让线程处理free这些分配:

struct cmd_args *p = t;

...

for (int i = 0; i < argc; ++i)
    free(p->argv[i]);

free(p->argv);
free(p);

推荐阅读