如何将char* argv[]传递给pthread_create?

3

我正在尝试将传递给主线程的任何参数传递给我使用“pthread_create”创建的“子线程”。

void *threadMainLoop(void *arg){
    char *arguments = (char*)arg;
    printf("arg 1 - %s\n", arguments[1]);

}

int main(int argc, char *argv[]){
    printf("Start of program execution\n");

    rc = pthread_create(&outboundThread, NULL, threadMainLoop, (void *) argv);
    printf("Thread create rc: %i, %d\n", rc, outboundThread);
    if(rc != 0){
        printf("Thread creation failed\n");
        exit(1);
    }
    pthread_join(outboundThread, NULL);
    return 0;
}

上述代码无法正常工作,您能否告诉我如何在线程中访问ARGV数组,例如"argv[0]"?

2个回答

4
main 中的 argv 是一个 char**,而不是一个 char*,因此在 threadMainLoop 中你应该将它强制转换回来。

1
嗨,感谢您的反馈...非常感谢。我对C语言还很陌生,您能向我展示如何在“threadMainLoop”中使用char **进行强制转换吗? - Lynton Grice
你好,根据下面GNU教程的说法,argv是一个char *argv[]类型的变量?这就是为什么我会这样使用它.....我错了吗?http://www.crasseux.com/books/ctutorial/argc-and-argv.html - Lynton Grice
没有给出任何如何实现的例子,即使被问及,仅仅陈述一个事实就会被扣1分。 - Mote Zart
@MoteZart:我不介意被踩,但我猜想我10年前没有按要求回应的原因是,在我请求示例后的14分钟内,Lynton发布了一个答案,他们已经弄清如何将类型转换为char **而不是char *。-1 因为我没在线上,这次算了,只要不成为常规规则就行;-) - Steve Jessop

3

现在它可以工作了...感谢Steve推动了正确方向...

void *threadMainLoop(void *arg){
    char **arguments = (char**)arg;   
    printf("args[0] =%s\n", arguments[0]);
    printf("args[1] =%s\n", arguments[1]);
}

int main(int argc, char *argv[]){
    printf("Start of program execution\n");

    rc = pthread_create(&outboundThread, NULL, threadMainLoop, (void *) argv);
    printf("Thread create rc: %i, %d\n", rc, outboundThread);
    if(rc != 0){
        printf("Thread creation failed\n");
        exit(1);
    }
    pthread_join(outboundThread, NULL);
    return 0;
}

我在我的代码中使用了你的答案,但是我发现了一个大错误。你必须复制argv,而不能直接使用它。Argv是一个自动变量。在回调函数中使用之前,argv可能会被销毁。只需在threadMainLoop的第一行添加sleep(2),你就会发现它不再起作用了! - ArthurLambert
我正在使用这段代码。它是否更新到可工作的版本,还是仍然存在转换问题?我没有看到任何关于如何将threadMainLoop转换回去的回复,只有抱怨说你应该这样做。 - Mote Zart

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