【问题标题】:pthread_create int instead of voidpthread_create int 而不是 void
【发布时间】:2013-08-26 23:47:04
【问题描述】:

我有以下代码:

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
}

*如何将 (void *)do_process 转换为 (int) do_process ?*

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

我收到以下错误:警告:传递 `pthread_create' 的 arg 3 使指针从整数而不进行强制转换

【问题讨论】:

  • 我认为至少显示do_process声明 是可能的吗?但除此之外,是否有某些原因您不能将 arg_result 放入您的 args 结构中并用它传达您的返回结果?
  • 将返回值放入args,并返回。您可以在返回时询问 args...使用 pthread_join 中的第二个参数。
  • 我认为这是个好主意。 pthread_join 中的第二个参数是什么?我将值设置为 NULL。

标签: c pthreads


【解决方案1】:

只需编写一个正确类型的辅助函数,但它所做的只是获取 void * 输入参数,从中获取所有正确的参数,调用您的函数,获取该函数的返回值,然后将其打包作为 void * 供 pthread_join 获取。

对于您的具体问题,您不能/不应该。只要按照我上面概述的去做,你就会很成功。

【讨论】:

    【解决方案2】:

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

    void * do_process (void *arg) {
        /* ... */
        int *result = malloc(sizeof(int));
        *result = the_result_code;
        return result;
    }
    

    然后,您可以从thread_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);
            /* ... */
        }
    

    【讨论】:

    • 但是 do_process 不返回 void*,它返回 int。我想从技术上讲,他并没有说它不能改变,但他从来没有说过它可以,我不认为。
    • 他问“我如何将 (void *)do_process 转换为 (int)do_process”,这可能意味着几件事。但我的回答是,你传递给pthread_create() 的函数返回一个void *,所以返回一个。
    • 我试过了,它正确地发送了返回,但它对所有启动的线程使用相同的值(文件、单词、repl)。我怎样才能避免这种情况?谢谢
    • 如果在我的示例中将 the_result_code 替换为 rand(),那么在每次加入后,result 肯定会保存随机值。所以,如果你得到相同的值,那是因为你的代码返回了相同的值。尝试编译并运行this example program
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2019-06-05
      • 2014-12-11
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多