2013-03-25 48 views
1

我寫了mergesort算法,它工作正常。然後我評論的功能遞歸調用,並試圖用一些的boost ::線程是這樣的:多線程mergesort

#include <iostream> 
#include <vector> 
#include <boost/thread.hpp> 

void merge_sort(std::vector <int> & tab, size_t beg, size_t end) 
{ 
    if(beg < end) 
    { 
     size_t pivot = (beg + end) >> 1; 

     boost::thread left(merge_sort, tab, beg, pivot); 
     //merge_sort(tab, beg, pivot); 
     boost::thread right(merge_sort, tab, pivot + 1, end); 
     //merge_sort(tab, pivot + 1, end); 
     left.join(); 
     right.join(); 

     std::vector <int> buf (tab); 
     size_t i = beg, j = pivot + 1, q = beg; 
     while (i <= pivot && j <= end) 
     { 
      if (buf[i] < buf[j]) 
       tab[q++] = buf[i++]; 
      else 
       tab[q++] = buf[j++]; 
     } 
     while (i <= pivot) 
      tab[q++] = buf[i++]; 
    } 
} 

int main() 
{ 

    const int myints[] = {30,29,28,27,26,25,1,2,3,4,5,6,7,24,23,22,21,20,19,18,8,9,10,11,17,16,15,13,45,12}; 
    std::vector <int> kontener (myints, myints + sizeof(myints)/sizeof(int)); 

    merge_sort(kontener, 0, kontener.size() - 1); 

    for(std::vector <int>::iterator it = kontener.begin(); it != kontener.end(); it++) 
     std::cout << *it << " "; 
    std::cout << std::endl; 

    std::cin.sync(); 
    std::cin.get(); 
    return(0); 
} 

但我有錯輸出與此線程。 :P 因此,如果有人能告訴我這段代碼出了什麼問題,那麼我將會非常不情願。

回答

2

實際上,您並未將矢量作爲參考傳遞給子線程,即使看起來如此。您需要使用boost::refstd::ref。還要注意的是,緩衝區只必須是一樣大的,你目前正在使用的部分,存在複製整個向量所有的時間是沒有意義的:

boost::thread left(merge_sort, boost::ref(tab), beg, pivot); 
    boost::thread right(merge_sort, boost::ref(tab), pivot + 1, end); 
    left.join(); 
    right.join(); 

    std::vector <int> buf (tab.begin()+beg, tab.begin()+end+1); 
    size_t i = beg, j = pivot + 1, q = beg; 
    while (i <= pivot && j <= end) 
    { 
     if (buf[i-beg] < buf[j-beg]) 
      tab[q++] = buf[i++ - beg]; 
     else 
      tab[q++] = buf[j++ - beg]; 
    } 
    while (i <= pivot) 
     tab[q++] = buf[i++ - beg]; 

(另外,該代碼很可能是注意一個如果你使用迭代器和標準算法,但是爲了簡單起見,我保留了你的結構。)