簡體   English   中英

從 'void* (*)(int*)' 到 'void* (*)(void*)' 的無效轉換

[英]invalid conversion from 'void* (*)(int*)' to 'void* (*)(void*)'

我正在嘗試計算多線程 C++ 程序來計算 N 個第一個 integer 數字的立方和。

每個線程應該計算一個部分和以平均分配它們之間的工作。 與 pthread_create arguments 苦苦掙扎,它給出了錯誤。


#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* ,並將其轉換為 function 內的int* ,所以它看起來像這樣:

void* cube_array(void* temp_arr) 
{ 
    int* arr = (int*)temp_arr;
    
    int thread_part = part++; 

PS你應該從 pthread 切換到std::threadstd::future

自 c++11 標准以來,標准庫中就有線程支持,因此您可以使用std::thread代替 pthread。 它對不同的線程 function 簽名沒有問題,但對您需要的任何功能變體都有很好的支持。

#include <iostream> 
#include <thread>
#include <deque>
#include <algorithm>

#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) 
{
    for (int i = (thread_part * n) / p; i < ((thread_part + 1) * n) / p); i++) {
        sum[thread_part] += arr[i]*arr[i]*arr[i]; 
        }
} 

// Driver Code 
int main() 
{ 

    std::deque<std::thread> threads; 


    for (int i = 0; i < p; ++i) 
        threads.emplace_back(std::thread(cube_array, arr, part++)); 

    for (int i = 0; i < threads.size(); ++i) 
        threads[i].join(); 

    int total_sum = 0; 
    for (int i = 0; i < p; i++) 
        total_sum += sum[i]; 

    cout << "sum is " << total_sum << endl; 

    return 0; 
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM