C pthread_创建int而不是void

C pthread_创建int而不是void,c,pthreads,C,Pthreads,我有以下代码: for(i = 0 ; i < max_thread; i++) { struct arg_struct args; args.arg1 = file; args.arg2 = word; args.arg3 = repl; if(pthread_create(&thread_id[i],NULL,&do_process,&args) != 0) { i--; fprin

我有以下代码:

for(i = 0 ; i < max_thread; i++)
{
    struct arg_struct args;
    args.arg1 = file;
    args.arg2 = word;
    args.arg3 = repl;
    if(pthread_create(&thread_id[i],NULL,&do_process,&args) != 0)
    {
        i--;
        fprintf(stderr,RED "\nError in creating thread\n" NONE);
    }
}
for(i = 0 ; i < max_thread; i++)
    if(pthread_join(thread_id[i],NULL) != 0)
    {
        fprintf(stderr,RED "\nError in joining thread\n" NONE);
    }


int do_process(void *arguments)
{
//code missing
}
for(i=0;i
*如何将(void*)do\u进程转换为(int)do\u进程?*

该函数返回非常重要的信息,没有这些返回,我不知道如何读取回复


我得到了以下错误:警告:传递'pthread_create'的arg 3会使指针从整数变为不带强制转换的指针

只需编写一个正确类型的帮助函数,但它所做的只是获取void*输入参数,从中获取所有正确的参数,调用函数,获取该参数的返回值,并将其打包为一个void*以便pthread_join获取


对于你的具体问题,你不能/不应该。只要照我上面所说的去做,你就会变成黄金。

线程函数返回一个指针。至少,您可以动态分配一个整数并返回它

void * do_process (void *arg) {
    /* ... */
    int *result = malloc(sizeof(int));
    *result = the_result_code;
    return result;
}
然后,您可以从
thread\u join()
调用中恢复此指针

    void *join_result;
    if(pthread_join(thread_id[i],&join_result) != 0)
    {
        fprintf(stderr,RED "\nError in joining thread\n" NONE);
    } else {
        int result = *(int *)join_result;
        free(join_result);
        /* ... */
    }

pthread_join()是两个线程之间通信的一种简单方式。它有两个局限性。首先,它只能从指针传递一个值(可以将其设为指针并存储多个值)。其次,您只能在线程全部完成时返回它——返回此值后,线程进入终止状态。因此,如果您希望线程以更细粒度的方式进行通信,那么使用公共共享数据将更好地为您服务。当然,至少,您需要使用Pthread mutex来同步对公共数据的访问。而且,如果您想让线程彼此通信,那么还需要使用Pthread condvars。

我不认为至少可以显示
do\u process
的声明?但除此之外,还有什么原因不能将
arg_结果
放入
args
结构并用它传递返回结果吗?将返回值放入
args
并返回它。您可以在返回时询问
args
。使用
pthread\u join
中的第二个参数。我认为这是一个好主意。pthread_中的第二个参数加入了什么?我将该值设置为NULL。但do_进程不返回void*,它返回int。我猜从技术上讲,他并没有说它不能更改,但他也从来没有说它可以更改。我不认为。他问“我如何将(void*)do_进程转换为(int)do_进程”,这可能意味着几件事。但我的答案是,传递给
pthread\u create()
的函数返回一个
void*
,因此返回一个。我尝试了,它正确地发送了返回,但它对所有启动的线程使用相同的值(file、word、repl)。我怎样才能避免这种情况?谢谢,如果在我的示例中,
result\u code
被替换为
rand()
,那么每次加入后,
result
肯定会包含随机值。因此,如果您得到相同的值,那是因为您的代码返回相同的值。尝试编译并运行。