2015-10-26 65 views
0

我工作的一個並行線程代碼做重複矩陣向量積的說法。當我這樣做時,我首先編寫了用於乘法的串行矩陣向量代碼,然後我嘗試將矩陣向量乘積放入單獨的線程中。在pthread_create似乎刷新傳遞給輸入功能

代碼https://github.com/viswans/parallel-computing-cs525/blob/pthread/pthread_page_rank/src/pthread/pagerankPthread.cpp做什麼,我只是描述。特別是當線程數量從8增加到9時,二進制會導致分段錯誤。

使用gdb調試我注意到,有被dereferenced一個空指針,而我加在該指針的手錶以瞭解是否被正確設置它。我注意到從pthread_create調用的函數的參數似乎被刷新並設置爲0!

Old value = 37843                                  
New value = 45242576                                 
0x0000000000403436 in __gnu_cxx::new_allocator<(anonymous namespace)::ThreadStruct>::construct<(anonymous namespace)::ThreadStruct, (anonymous namespace)::ThreadStruct> (this=0x2b25970, __p=0x2b260e0) at /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.4/include/g++-v4/ext/new_allocator.h:120      
120    { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }                   
(gdb) c                                    
Continuing.                                   
[New Thread 0x7ffff2985700 (LWP 3390)]                            
[New Thread 0x7ffff2184700 (LWP 3391)]                            
[New Thread 0x7ffff1983700 (LWP 3392)]                            
[New Thread 0x7ffff1182700 (LWP 3393)]                            
Hardware watchpoint 3: *(0x2b260e8)                             

Old value = 45242576                                 
New value = 0                                   
0x00007ffff708eedb in __memset_sse2() from /lib64/libc.so.6                       
(gdb) bt                                    
#0 0x00007ffff708eedb in __memset_sse2() from /lib64/libc.so.6                      
#1 0x00007ffff7ded2e2 in allocate_dtv() from /lib64/ld-linux-x86-64.so.2                   
#2 0x00007ffff7ded9be in _dl_allocate_tls() from /lib64/ld-linux-x86-64.so.2                  
#3 0x00007ffff7bc9fc5 in [email protected]@GLIBC_2.2.5() from /lib64/libpthread.so.0                 
#4 0x0000000000402b47 in PageRank::PageRankPthread::calculatePageRank (matrix=std::shared_ptr (count 1, weak 0) 0x2b258d0,�       
    input=std::vector of length 196591, capacity 196591 = {...}, num_threads=9, criterion=...) at src/pthread/pagerankPthread.cpp:84     
    #5 0x0000000000401d5d in mainPthread (argc=3, argv=0x7fffffffe6b8) at src/pthread/mainPthread.cpp:31            
    #6 0x000000000040be47 in main (argc=3, argv=0x7fffffffe6b8) at src/main.cpp:9  

任何有關爲什麼pthread_create將刷新參數的見識將不勝感激。 感謝 Sudharshan

回答

0

你叫push_backtstruct載體,所有指針失效成矢量,導致線程訪問已移動的結構。一個簡單的解決方法是在std::vector<ThreadStruct> tstruct;之後添加tstruct.reserve(num_threads);

但你真的應該重新考慮這一點,並以更合理的方式做事情。當需要指向集合的指針以便在集合被修改時保持有效時,構造的向量是否適合使用集合?

+0

嘿@david非常感謝你指出了這一點。這真是一個驚人的故事,我爲我犯了錯誤而感到高興!我修改了循環以在單獨的循環中創建線程。另一方面,考慮到pthread API的限制,比傳遞元素的地址更好。 –

+0

@SudharshanViswanathan一種常見的方法是用'new'創建線程需要的數據,並讓線程在完成時刪除它。如果需要通信,則可以使用'shared_ptr'並保留'shared_ptr'的向量。 –