2013-10-23 41 views
0

该代码工作正常,但不使用openmp。我已经使用私人和共享,但它仍然在我的struct SinRes定义的行上提供了SIGSEGV。为什么这个openmp给SIGSEGV?

#pragma omp parallel for private(row, dt1, dt1s, dtmp, dat1, atur) shared(turVec) 
for(row=0; row<ndicts; ++row) 
{ 
    dt1 = kI(keys)[row]; 
    dt1s = to_string(dj(dt1)); 
    dtmp = dt1s.substr(0, 4) + "." + dt1s.substr(4, 2) + "." + dt1s.substr(6, 2); 
    dat1 = kK(data)[row]; 
    dat1s = kK(dat1->k)[1]; 
    atur = breakLogic(dat1s, mpar, dtmp); 
    ///free(atur); 
    turVec.push_back(atur); 
} 

的错误消息是

(gdb) run 5 x5.csv 
Starting program: /root/cwork/ompTur 5 x5.csv 
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x2aaaaaacd000 
[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". 
[New Thread 0x2aaaac2e1700 (LWP 17500)] 
[New Thread 0x2aaaac4e2700 (LWP 17501)] 
[New Thread 0x2aaaac6e3700 (LWP 17502)] 
[New Thread 0x2aaaad1e9700 (LWP 17503)] 
[New Thread 0x2aaaad3ea700 (LWP 17504)] 
[New Thread 0x2aaaad5eb700 (LWP 17505)] 
[New Thread 0x2aaaad7ec700 (LWP 17506)] 

Program received signal SIGSEGV, Segmentation fault. 
[Switching to Thread 0x2aaaad7ec700 (LWP 17506)] 
0x0000000000407a7a in sinRes::sinRes (this=0x2aaab401f430) at ompTur.cpp:33 
33  struct sinRes { 
(gdb) 

我是新来的OpenMP。我是否需要使用其他任何结构,如critical

为SinRes的代码只是

struct sinRes { 
    double pnl, numTrds, firstVar; 
    string dt; 
}; 
+0

它看起来像你粉碎堆栈。 –

+0

你的意思是超载吗?我已经将它设置为无限制并且正在监视内存使用情况。这似乎只是〜500MB。 –

+0

我的意思是某些代码在某些局部变量的边界之外写入,因此在不应该改变的地方更改堆栈。 –

回答

0

看来您声明std::string类型的变量作为omp privateomp shared。它可能不会工作,因为std::string使用动态内存分配,并且不是线程安全的。

Is std::string thead-safe with gcc 4.3?

你可能需要在手动定义线程本地的std :: string for循环,并避免使用std::string::push_back(),因为它涉及到比赛状态。

+0

这是造成竞赛状况的推回。把它改成turVec [itr] = atr,它就起作用了。 –

+0

将变量声明为'private'会创建**未初始化的**线程本地副本。 –

1

标准C++容器类在写操作方面不是线程安全的。一个具有使用显式同步存取,例如:

#pragma omp critical 
turVec.push_back(atur); 

operator[]不延伸到矢量对象的内部存储必要时并因此允许并发访问。

相关问题