尝试创建线程时,从"void*(*)(int(*)[2])"到"void*)(void*)

  • 本文关键字:quot void int 创建 线程 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 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, "%ldn", *it);
}
fclose(fduw);
exit(0);
}

我想在多个子线程中运行这个函数:

int fds[2][2];
pipe(fds[DOWN]);
pipe(fds[UP]);
pthread_create(&threads[i], NULL, sort_chunk, fds);

当我尝试创建线程时,我得到:

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++中,函数中需要显式的static_cast,这很难看。但是对于C++,您可能无论如何都应该使用std::thread。

相关内容

最新更新