2011-04-18 91 views
1

我的程序在字符串赋值中崩溃。我不能忽视它的确切原因。多个线程执行相同的代码。由于Linux C++中的SIGABRT导致的崩溃PowerPC

这是我的代码。

char* cTemp = new char[5]; 
    memset(cTemp,'\0', 5); 
    snprintf(cTemp , 5 , "%04x" , iParameter); 
    string sVar1 = cTemp; 
    delete[] cTemp; 
    if(sVar1 == "0") 
    sVar1 = "0000"; 
    pSharedLib->setVar1(sVar1); 

所设定的功能(在共享库)

bool A::setVar1(CString& temp) 
    { 
    m_sVar1= temp; 
    return true; 
    } 

碰撞BT示出了误差作为

#0 0x48194444 in raise() from /lib/libc.so.6 
#0 0x48194444 in raise() from /lib/libc.so.6 
No symbol table info available. 
#1 0x48199694 in abort() from /lib/libc.so.6 
No symbol table info available. 
#2 0x481d4ecc in ??() from /lib/libc.so.6 
No symbol table info available. 
#3 0x481e14d4 in ??() from /lib/libc.so.6 
No symbol table info available. 
#4 0x481e32b0 in free() from /lib/libc.so.6 
No symbol table info available. 
#5 0x480df8b8 in operator delete(void*)() from /usr/lib/libstdc++.so.6 
No symbol table info available. 
#6 0x480b136c in std::string::_Rep::_M_destroy(std::allocator<char> const&) 
() from /usr/lib/libstdc++.so.6 
No symbol table info available. 
#7 0x480b35f4 in std::string::assign(std::string const&)() 
from /usr/lib/libstdc++.so.6 
No symbol table info available. 
+2

'string'和'CString'似乎是不同的类型。 – Erik 2011-04-18 11:13:03

+0

多数民众赞成在一个错别字对不起....都是字符串..我已经淡化了一些函数/ typedefs,使其更简单! – Prashanth 2011-04-18 11:20:23

回答

3

我看不出有任何的同步对象保护组m_sVar1的。您提到setVar1可以同时从多个线程中调用,STL的线程保证并不保证该分配对于多线程是安全的。

+0

雅,这可能是问题一起通过裁判,我现在正在做的!!!但我想知道这是否会导致SIGABRT? – Prashanth 2011-04-18 11:29:10

+0

当然。字符串:: assign在逻辑上是“删除字符串;字符串= arg;”。如果两个线程试图删除同一块内存(并注意到你在free()中崩溃),那么你可能会损坏这个堆。在这种情况下,它看起来像堆检测到错误,并调用abort(),然后引发SIGABRT。 – 2011-04-18 11:48:21

+0

感谢信息人!这确实有很大的帮助! – Prashanth 2011-04-18 11:53:02

0

我怀疑的关键,这个问题是

多个线程执行相同的代码。

如果有一个字符串m_sVar1,和多个线程同时被分配给它,那么机会是相当不错的一个竞争条件会导致腐败。您需要通过关键部分妥善保护该变量。

+0

谢谢,我想这可能是问题所在。让我试着通过互斥或信号量来保护它,从而再次重现问题! – Prashanth 2011-04-18 11:35:06