2015-10-13 45 views
0

我有一個解決這些二維迷宮的程序,它對我來說相當好,但是我用gprof(和@ jrfonseca的花哨gprof2dot)對它進行了描述,在我看來這很難過與一些操作並決定做一些並行嘗試。這個奇怪的叮噹編譯錯誤

在消耗50%(CPU?)時間我有parallelising的兩個選擇( 多個消費者單個隊列和相同功能的類似不等於參數 並行調用)還想做一個功能

基本上首先獨立地檢查一個最好的假設,哪一個會更好,我並不總是做C++代碼,並通過搜索互聯網如何獲得std::thread返回一個值,我讀了一個很好的回答與std::future意見,然後我將其複製到我的代碼中,那麼請你知道這是什麼意思...

bash-4.3$ sh build.sh 
In file included from find_path.cpp:6: 
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/Xco 
deDefault.xctoolchain/usr/bin/../include/c++/v1/future:371: 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/ 
usr/bin/../include/c++/v1/thread:337:5: error: 
     attempt to use a deleted function 
    __invoke(_VSTD::move(_VSTD::get<0>(__t)), _VSTD::move(_VSTD::get<_In... 
    ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/ 
usr/bin/../include/c++/v1/thread:347:5: 
     in instantiation of function template specialization 
     'std::__1::__thread_execute<void 
     (*)(std::__1::priority_queue<std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > >, 
     std::__1::vector<std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > >, 
     std::__1::allocator<std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > > > >, NearerTarget> &, 
     std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > > &, std::__1::pair<int, 
     int> &, int, int, int, int, unsigned char *, 
     std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > > &, int, int, 
     std::__1::promise<bool> &&), 
     std::__1::reference_wrapper<std::__1::priority_queue<std::__1::vector<std 
::__1::pair<int, 
     int>, std::__1::allocator<std::__1::pair<int, int> > >, 
     std::__1::vector<std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > >, 
     std::__1::allocator<std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > > > >, NearerTarget> >, 
     std::__1::reference_wrapper<std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > > >, 
     std::__1::reference_wrapper<std::__1::pair<int, int> >, int, int, int, 
     int, const unsigned char *, 
     std::__1::reference_wrapper<std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > > >, int, int, 
     std::__1::promise<bool> , 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12>' 
     requested here 
    __thread_execute(*__p, _Index()); 
    ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/ 
usr/bin/../include/c++/v1/thread:359:42: note: 
     in instantiation of function template specialization 
     'std::__1::__thread_proxy<std::__1::tuple<void 
     (*)(std::__1::priority_queue<std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > >, 
     std::__1::vector<std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > >, 
     std::__1::allocator<std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > > > >, NearerTarget> &, 
     std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > > &, std::__1::pair<int, 
     int> &, int, int, int, int, unsigned char *, 
     std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > > &, int, int, 
     std::__1::promise<bool> &&), 
     std::__1::reference_wrapper<std::__1::priority_queue<std::__1::vector<std 
::__1::pair<int, 
     int>, std::__1::allocator<std::__1::pair<int, int> > >, 
     std::__1::vector<std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > >, 
     std::__1::allocator<std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > > > >, NearerTarget> >, 
     std::__1::reference_wrapper<std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > > >, 
     std::__1::reference_wrapper<std::__1::pair<int, int> >, int, int, int, 
     int, const unsigned char *, 
     std::__1::reference_wrapper<std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > > >, int, int, 
     std::__1::promise<bool> > >' requested here 
    int __ec = pthread_create(&__t_, 0, &__thread_proxy<_Gp>, __p.get()); 
             ^
find_path.cpp:258:25: note: in instantiation of function template specializatio 
n 
     'std::__1::thread::thread<void 
     (*)(std::__1::priority_queue<std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > >, 
     std::__1::vector<std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > >, 
     std::__1::allocator<std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > > > >, NearerTarget> &, 
     std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > > &, std::__1::pair<int, 
     int> &, int, int, int, int, unsigned char *, 
     std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > > &, int, int, 
     std::__1::promise<bool> &&), 
     std::__1::reference_wrapper<std::__1::priority_queue<std::__1::vector<std 
::__1::pair<int, 
     int>, std::__1::allocator<std::__1::pair<int, int> > >, 
     std::__1::vector<std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > >, 
     std::__1::allocator<std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > > > >, NearerTarget> >, 
     std::__1::reference_wrapper<std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > > >, 
     std::__1::reference_wrapper<std::__1::pair<int, int> >, int &, int &, 
     const int &, const int &, const unsigned char *&, 
     std::__1::reference_wrapper<std::__1::vector<std::__1::pair<int, int>, 
     std::__1::allocator<std::__1::pair<int, int> > > >, const int &, int, 
     std::__1::promise<bool> , void>' requested here 
      std::thread n(&move, std::ref(active_paths), 
         ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/ 
usr/bin/../include/c++/v1/type_traits:1043:5: note: 
     '~__nat' has been explicitly marked deleted here 
    ~__nat() = delete; 
    ^
1 error generated. 
bash-4.3$ 

...在這方面?

一些find_path.cpp:

1 // For 'assert(expression)'. 
2 #include <cassert> 
3 // For 'std::abs' (absolute value function, integers version)'. 
4 #include <cstdlib> 
5 // For 'std::promise' and 'std::future'. 
6 #include <future> // <-- 
7 // For 'std::mutex'. 
8 #include <mutex> 
9 // For 'std::priority_queue'. 
10 #include <queue> 
11 // For 'std::move'. 
12 #include <utility> 
13 // For 'std::vector'. 
14 #include <vector> 
15 // For 'std::thread'. 
16 #include <thread> 
17 // For 'std::get', 'std::make_tuple' and 'std::tuple'. 
18 #include <tuple> 

一些更多:

242    // Do not add new paths unless deemed necessary. 
243    bool add_north_move, add_west_move, add_south_move, add_east_move; 
244    add_north_move = add_west_move = add_south_move = add_east_move = 
245     0; 
246 
247    // Another helper. 
248    std::vector < std::pair < int, int > > active_paths_top = 
249     active_paths.top(); 
250    std::pair < int, int > active_paths_top_back = 
251     active_paths_top.back(); 
252 
253    // Directions clockwise (0: 'N', 1: 'E', 2: 'S', 3: 'W'). 
254    int direction = 0; 
255 
256    std::promise <bool> n_p; 
257    auto n_f = n_p.get_future(); 
258    std::thread n(&move, std::ref(active_paths), // <-- 
259       std::ref(active_paths_top), 
260       std::ref(active_paths_top_back), new_move_back_x, new_move_back_y, 
261    nMapWidth, nMapHeight, pMap, std::ref(north_move), nOutBufferSize, direction++, std::move(n_p) 
262   ); 
263    std::promise <bool> e_p; 
264    auto e_f = e_p.get_future(); 
265    std::thread e(&move, std::ref(active_paths), 
266       std::ref(active_paths_top), 
267       std::ref(active_paths_top_back), new_move_back_x, new_move_back_y, 
268    nMapWidth, nMapHeight, pMap, std::ref(east_move), nOutBufferSize, direction++, std::move(e_p) 
269   ); 

含量的void move(12)

108 void move(std::priority_queue < 
109   std::vector < std::pair < int, int > >, 
110   std::vector < std::vector < std::pair < int, int > > >, 
111   NearerTarget 
112  > & active_paths, 
113  std::vector < std::pair < int, int > > & active_paths_top, 
114  std::pair < int, int > & active_paths_top_back, int new_move_back_x, int new_move_back_y, 
115  int map_width, int map_height, unsigned char * map, std::vector < std::pair < int, int > > & move, 
116  int out_buffer_size, int direction, 
117  std::promise <bool> && add_move) { 
118  assert(-1 < direction && 4 > direction); 
119  std::pair < int, int > new_coord; 
120  switch (direction) { 
121  case 0: 
122    // Add move 'N'. 
123    new_coord = std::make_pair(
124      active_paths_top_back.first, 
125      active_paths_top_back.second + 1); 
126    break; 
127  case 1: 
128    // Add move 'E'. 
129    new_coord = std::make_pair(
130      active_paths_top_back.first + 1, 
131      active_paths_top_back.second); 
132    break; 
133  case 2: 
134    // Add move 'S'. 
135    new_coord = std::make_pair(
136      active_paths_top_back.first, 
137      active_paths_top_back.second - 1); 
138    break; 
139  case 3: 
140    // Add move 'W'. 
141    new_coord = std::make_pair(
142      active_paths_top_back.first - 1, 
143      active_paths_top_back.second); 
144    break; 
145  } 
146 
147    // Push it to the queue of paths only if the movement 
148    // makes sense. 
149    new_move_back_x = new_coord.first; 
150    new_move_back_y = new_coord.second; 
151    if (new_move_back_x > -1 && new_move_back_x < map_width && 
152      new_move_back_y > -1 && new_move_back_y < map_height) 
153    { 
154     // Move is inside bounds. 
155 
156     // Check collision detection. 
157     if (map[new_move_back_y * map_width + new_move_back_x]) 
158     { 
159      // Check not visited. 
160      if (! visited(
161         new_move_back_x, 
162         new_move_back_y, 
163         active_paths.top())) 
164      { 
165       move = active_paths_top; 
166       move.reserve(out_buffer_size); 
167       move.push_back(new_coord); 
168       add_move.set_value(true); 
169      } 
170     } 
171    } 
172 } 

它告訴我explicited標記刪除~__nat,我不記得甚至夢想做這樣的事情。

有點用於pthreads,Python線程,Java並行模型...不太瞭解不確定的選擇,一般的異步,承諾...我應該努力讓std::future使用?

+0

請顯示find_path.cpp:258 – AndyG

+0

看起來您的函數'move'接受'priority_queue',並且您沒有提供當你嘗試在第258行中創建一個線程時。 – AndyG

+0

'move'設置爲接受'std :: priority_queue >,std :: vector >>,NearerTarget>&'作爲其第一個參數,然後傳遞一個'的std :: REF(標準:: priority_queue <性病::矢量<性病::對< int, int >,性病::矢量<性病::矢量>>,NearerTarget>)' – uprego

回答

2

該錯誤消息與新的C++功能相關,「刪除」默認操作員使其無法訪問(之前,通常的技術是使其變爲私有)。

就你而言,它表示線程構造函數的參數有問題。您的代碼是相當複雜的,但你可能會遇到這個問題:C++ std::thread "Attempt to use a deleted function"

我肯定會推薦繼續STD:未來。有關介紹,強烈建議Herb Sutter對新C++併發功能進行以下講座:https://channel9.msdn.com/Shows/Going+Deep/C-and-Beyond-2012-Herb-Sutter-Concurrency-and-Parallelism

+0

什麼是'運營商'?那裏沒有默認的操作符。 – SergeyA

+0

有'結構NearerTarget {布爾運算符()(常量的std ::矢量<性病::對< int, int >>&LHS,常量性病::矢量<性病::對< int, int >>&RHS)常量{/ *的Bleh的Bleh的Bleh布爾某事*/return(SOMETHING); }};'但與編譯問題沒有關係。 – uprego