2014-12-03 71 views
0

嘗試使此函數正常工作時出現錯誤。我在寫一個並行合併排序函數。錯誤是我似乎無法弄清楚如何傳遞一個向量到pthread_create函數。我似乎無法弄清楚如何傳遞有關向量的所有信息,以便並行mergesort可以工作,但仍然可以將其轉換爲void *,以便我可以將它作爲pthread_create函數的參數傳遞。使用pthreads似乎無法通過pthread_create函數傳遞向量

`void parallel_mergesort(void * a) {` 


     //std::vector<int> v = (std::vector<int>) * a; 




    vector<int>* v = static_cast<vector<int>*>(a); 
     int mid = v->size()/2; 
     pthread_t threads[2]; 

     int count; 

     std::vector<int> * v1; 
     std::vector<int> * v2; 


     int start = 0; 
     int end = 0; 

     for (int i =0; i < mid; i++) 
     { 
     v1[i] = v[i]; 
     start = i; 
     } 


     for (int j = 0; j < v->size(); j++) 
     { 
     v2[j] = v[j+mid]; 
     end = j + mid; 
     } 

     if (start >= end) return; 

     count = pthread_create(threads[0], NULL, parallel_mergesort, (&v1)); 
     if (count) { 
     printf("unable to create thread"); 
     exit(1); 
     } 

     count = pthread_create(threads[1], NULL, parallel_mergesort, &v2); 
     if (count) { 
     printf("unable to create thread"); 
     exit(1);  
     } 

     pthread_join(&threads[0], NULL); 
     pthread_join(&threads[1], NULL); 


     //merge(.. 
     pthread_exit(NULL); 


    } 

int main() 
{ 
std::fstream infile("data.txt", std::ios_base::in); 
std::fstream outfile_pms("parallelmergesorted.txt", std::ios_base::out); 



std::vector<int> parallel_mergesorted = vals; 
parallel_mergesort(parallel_mergesorted); 
for(std::vector<int>::iterator it = parallel_mergesorted.begin(); it != parallel_mergesorted.end(); ++it) { 
    outfile_pms << *it << std::endl; 
} 
} 
+0

我想出了「不能將pthread_t *和pthread_t中的線程[0]'轉換爲pthread_t的問題。」我需要拿出'&'號。然而,pthread_create函數仍然給我一些問題。 – user3088470 2014-12-03 14:58:54

+1

我建議您閱讀您最喜歡的書中關於指針的章節。 – molbdnilo 2014-12-03 15:01:45

+1

@ user3088470你能編輯你的代碼來發佈一個自編的例子嗎(參見http://sscce.org/)? – 2014-12-03 15:09:37

回答

0

我們的想法是,綁定(指針)的參數的pthread_create第四參數。當線程啓動時,參數綁定到線程啓動例程的參數。

下面是一個簡單的例子:

#include <pthread.h> 
#include <stdlib.h> 
#include <stdio.h> 

/* start routine of the thread */ 
void *task(void *data) 
{ 
    char *s = data; /* cast argument to the appropriate type */ 

    puts(s); 
    return NULL; 
} 

/* entry point of the application */ 
int main(void) 
{ 
    char *s = "Hello, world!\n"; 
    pthread_t t; 

    pthread_create(&t, NULL, task, s); /* pass argument to thread */ 
    pthread_join(t, NULL);  

    return EXIT_SUCCESS; 
} 

如果你通過了,作爲一個線程的說法,一個指針,指向具有自動存儲時間的變量,要小心,並確保在範圍變量停留在至少只要線程可以訪問它。