2015-10-26 59 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'的向量。 –