Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 尝试创建线程时,从“void*(*)(int(*)[2])到“void*(*)(void*)”的转换无效_C++ - Fatal编程技术网

C++ 尝试创建线程时,从“void*(*)(int(*)[2])到“void*(*)(void*)”的转换无效

C++ 尝试创建线程时,从“void*(*)(int(*)[2])到“void*(*)(void*)”的转换无效,c++,C++,我有一个函数,它接收一对管道文件描述符,从一个管道中读取数字,对它们进行排序,然后通过第二个管道将其写回到父管道: void *sort_chunk(int fds[][2]) { close(fds[DOWN][WRITE]); FILE* fddr = fdopen(fds[DOWN][READ], "r"); char str[25]; vector<long int> nums; // Read from pare

我有一个函数,它接收一对管道文件描述符,从一个管道中读取数字,对它们进行排序,然后通过第二个管道将其写回到父管道:

void *sort_chunk(int fds[][2]) {
    close(fds[DOWN][WRITE]);
    FILE* fddr = fdopen(fds[DOWN][READ], "r");
    char str[25];
    vector<long int> nums;

    // Read from parent and sort
    while (fgets(str, 20, fddr)) {
        string fstr = string(str);
        fstr.erase(fstr.length() - 1); // Remove trailing line return
        nums.push_back(stol(fstr));
    }
    fclose(fddr);

    bubblesort(nums);

    // Write back to parent
    close(fds[UP][READ]);
    FILE* fduw = fdopen(fds[UP][WRITE], "w");
    for (auto it = nums.begin(); it != nums.end(); it++) {
        fprintf(fduw, "%ld\n", *it);
    }
    fclose(fduw);
    exit(0);
}
当我尝试创建线程时,我得到:

mysort.cc:139:38: error: invalid conversion from ‘void* (*)(int (*)[2])’ to ‘void* (*)(void*)’ [-fpermissive]
  139 |    pthread_create(&threads[i], NULL, sort_chunk, fds);
      |                                      ^~~~~~~~~~
      |                                      |
      |                                      void* (*)(int (*)[2])

您需要修复线程函数以匹配pthread_create期望的原型:

void *sort_chunk(void *fds_) {
    int (*fds)[2] = fds_;   // works for C -- need an explicit cast for C++
基本问题是pthread_create需要一个带有单个void*参数的特定类型的函数指针,因此您不能以任何其他方式安全地调用它


这在C中工作得很好,但是在C++中,你需要函数中的一个显式静态映射,这很难看。但是对于C++,你可能应该使用STD::线程不管。< /P> < P>你需要修复线程函数以匹配pthRead创建的原型:

void *sort_chunk(void *fds_) {
    int (*fds)[2] = fds_;   // works for C -- need an explicit cast for C++
基本问题是pthread_create需要一个带有单个void*参数的特定类型的函数指针,因此您不能以任何其他方式安全地调用它


这在C中工作得很好,但是在C++中,你需要函数中的一个显式静态映射,这很难看。但是对于C++,你可能应该使用STD::Type。./P>这是因为pthRead创建只接受一种函数指针作为参数,你不能在其中传递其他东西。到底有什么是不清楚的?线程函数的原型必须与void**void*完全匹配。其他任何东西都无法编译。如果您强制它使用强制转换进行编译,它可能会在运行时失败。你必须做一个适当的函数。您可以在函数内部将void*参数强制转换为其真实类型。@它使用第四个参数,这些参数是函数的参数。下面介绍如何在C中执行此操作:。在C++中……@ USER881301,你是对的,我需要把ARG投射出来,这样就可以通过VATE *FDS了。如何在sort_chunks>中将fds重新转换为int[2][2]?这是因为pthread_create只接受一种类型的函数指针作为参数,不能在其中传递其他内容。到底有什么是不清楚的?线程函数的原型必须与void**void*完全匹配。其他任何东西都无法编译。如果您强制它使用强制转换进行编译,它可能会在运行时失败。你必须做一个适当的函数。您可以在函数内部将void*参数强制转换为其真实类型。@它使用第四个参数,这些参数是函数的参数。下面介绍如何在C中执行此操作:。在C++中……@ USER881301,你是对的,我需要把ARG投射出来,这样就可以通过VATE *FDS了。如何在sort_chunks>中重新将fds转换为int[2][2]?我尝试了你的代码,但没有成功。相反,我做了int*fds[2]=int*fds;而且效果很好,这和克里斯说的差不多,但他推荐了一个更严格的演员阵容。避免使用c样式转换。它关闭了编译器的所有大脑,允许可怕的错误绕过类型检查而成为运行时错误。使用StaseQuestCasfDSZ,但认真考虑丢弃P螺纹并使用STD::线程。它更便于携带,也更难升级。旁注:绝对要确定int-fds[2][2];将比线程寿命长。当线程指向的数据超出范围时,会非常糟糕。这是std::thread试图帮助解决的问题之一。它默认为获取数据的副本。也就是说,不能复制数组。由于数组衰减,它们总是通过指针传递。你需要一个std::数组。我试过你的代码,但它不起作用。相反,我做了int*fds[2]=int*fds;而且效果很好,这和克里斯说的差不多,但他推荐了一个更严格的演员阵容。避免使用c样式转换。它关闭了编译器的所有大脑,允许可怕的错误绕过类型检查而成为运行时错误。使用StaseQuestCasfDSZ,但认真考虑丢弃P螺纹并使用STD::线程。它更便于携带,也更难升级。旁注:绝对要确定int-fds[2][2];将比线程寿命长。当线程指向的数据超出范围时,会非常糟糕。这是std::thread试图帮助解决的问题之一。它默认为获取数据的副本。也就是说,不能复制数组。由于数组衰减,它们总是通过指针传递。您需要一个std::数组。