gpt4 book ai didi

c++ - 尝试创建线程时从 ‘void* (*)(int (*)[2])’ 到 'void* (*)(void*) 的无效转换

转载 作者:行者123 更新时间:2023-12-02 09:51:41 25 4
gpt4 key购买 nike

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

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);
}
我想在多个子线程中运行这个函数:
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 期望的原型(prototype):

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 反正。

关于c++ - 尝试创建线程时从 ‘void* (*)(int (*)[2])’ 到 'void* (*)(void*) 的无效转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64091651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com