我有一个函数,它接收一对管道文件描述符,从一个管道读取数字,对它们进行排序,并通过第二个管道写回父级:
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。