linux - Ubuntu Linux中是否存在可以使子线程直接读取主线程的cmd参数的系统调用?
问题描述
最近我在做我的并行编程练习,这让我对参数发送的问题感到好奇。众所周知,我们可以使用函数 pthread_create 创建一个子线程,该子线程可以执行提到 pthread_create 参数的函数,就像参数发送一样,但是如果我想发送更多参数,我必须定义一个全局结构体。我想知道它非常复杂,是否有系统调用可以快速将这些参数直接传递给子线程?
解决方案
传递给主函数的参数也可以传递给线程函数。不,有系统调用可以做到这一点。
它并不像你想象的那么复杂。
一个简单的程序:
#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);
}
这是基于两个前提。
- 您的线程函数不会修改
argv
(如果存在多个线程并且它们都想修改) - 主线程等待线程函数完成后退出
如果这不合适,您可以简单地复制 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);
推荐阅读
- laravel - I'm Getting this Trojan Detection Error When Installing Laravel
- python - Spark for python - Null when cast it from string to decimals(36,12)
- javascript - 从 a 中获取值
- ,
- 树格式
- c# - MVC C# 网站 + WordPress 在同一个目录
- wavefront - OBJ Wavefront 文件:由于面顶点顺序引起的问题
- docker - 如何将多个容器的写入同步到集群上的同一卷?
- google-cloud-firestore - 以编程方式创建firestore触发器?
- sql - SQL - 在所有左连接时添加新表连接 - 初学者
- python - Django flash 消息仅显示在 django 管理页面而不是模板上
- azure - Azure sdk for Java 如何设置用户委派密钥和共享身份验证签名 SAS