c++ - 从 'void* (*)(int*)' 到 'void* (*)(void*)' 的无效转换
问题描述
我正在尝试计算多线程 C++ 程序来计算 N 个第一个整数的立方和。
每个线程应该计算一个部分和以平均分配它们之间的工作。挣扎于 pthread_create 参数它给出了错误。
#include <iostream>
#include <pthread.h>
#define n 6
#define p 4
using namespace std;
int part = 0;
int arr[] = { 1,2,3,4,5,6 };
int sum[p]={0};
void* cube_array(int arr[])
{
int thread_part = part++;
for (int i = thread_part * (n/ p); i < (thread_part + 1) * (n/ p); i++) {
sum[thread_part] += arr[i]*arr[i]*arr[i];
}
return NULL;
}
// Driver Code
int main()
{
pthread_t threads[p];
for (int i = 0; i < p; i++)
pthread_create(&threads[i], NULL, cube_array, (void*)NULL);
for (int i = 0; i < p; i++)
pthread_join(threads[i], NULL);
int total_sum = 0;
for (int i = 0; i < p; i++)
total_sum += sum[i];
cout << "sum is " << total_sum << endl;
return 0;
}
解决方案
根据文档,pthread_create()的签名是
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
所以你通过的函子应该接收 arg void*
(现在你正在接收int*
)。因此,只需将 arg 类型更改为void*
,并将其强制转换int*
为函数内部,它就会如下所示:
void* cube_array(void* temp_arr)
{
int* arr = (int*)temp_arr;
int thread_part = part++;
PS你应该从 pthread 切换到std::thread
or std::future
。
推荐阅读
- cross-compiling - 在 ubuntu 20 上编译内核 3.xx
- r - 在装扮的 SVM 函数上调整参数时出现未使用的参数错误
- c - 构建带有负节点的表达式树
- python - 从 10 个输出到 25 个输出 CNN,但修改后的代码不起作用?
- python - 需要 Cpanel SQLite 3.8.3 或更高版本(找到 3.7.17)
- javascript - 在 ReactJS 中获取 onComponentDidMount 期间出现 CORS 错误
- reactjs - Firebase Firestore 未接收数据库中的输入/返回,带有材料 ui 和反应
- jquery - 为什么没有身份就不能添加事件
- javascript - 已解决 : ReactJS : Uncaught TypeError: Cannot read property 'id' of undefined 使用 axios 发布到 Laravel 控制器时
- delphi - 设置字体设置不适用于创建动态标签