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::数组。