我與C++是一個新手,我得到了一個「分段錯誤(核心轉儲)」與C++ 11的線程玩的時候。我修改了一段我以前寫的好的代碼,並得到了錯誤。我修改的部分是分段錯誤(核心轉儲)與C++ 11線程
mutex m;
auto thread_f=[&](int i)
{
for(int j=i; j<interval.size(); j+=Threads_Number)
{
vector<Permutation >::iterator it1=(interval.begin()+j);
for(vector<Permutation >::iterator it2=it1; it2!=interval.end(); it2++)
{
if(!(*it1<*it2)) continue;
IntervalToCheck x(*it1,*it2);
m.lock();
cout<<x;
f<<x;
m.unlock();
}
}
};
vector<thread> threads;
threads.clear();
for(int i=0; i<Threads_Number; i++)
threads.push_back(thread(thread_f,i));
for(auto& th:threads)
th.join();
其中變量「f」是ofstream的一個對象。而且奇怪的是,當我「Threads_Number」設置爲1,程序運作良好,而當我設「Threads_Number」不是1,程序有時會工作得很好,有時並不---就像當我不初始化一個int舊時代並使用它。
這是我的G ++版本:
[email protected]:multiThreads> g++ --version 13-02-25 14:24
g++ (GCC) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
我用的是:
g++ -c main.cpp --std=c++11
g++ *.o -o work -lcln -lginac -pthread
編譯我的代碼。感謝您的關注,對不起我的英文不好。
看來,因爲我在課堂上使用GiNaC IntervalToCheck,它不是線程安全的(因爲我用Google搜索GiNac和線程安全的),因爲我得到了
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff5340700 (LWP 3125)]
0x00000000004097cf in GiNaC::ptr<GiNaC::basic>::operator= (this=0x7fffec000cd0, other=...) at /usr/include/ginac/ptr.h:88
88 delete p;
從GDB如牛米建議的消息。也許GiNaC是問題。如果任何人都可以提供處理表達的開放工具,那就太好了。 thx閱讀。
學習如何使用調試器來解決崩潰。 'gdb your-program-name'應該讓你開始。 – 2013-02-25 06:44:06
清除()一個空向量是沒有意義的。你不應該調用'm.lock()'和'm.unlock()',你應該使用其中一種標準的鎖類型 – 2013-02-25 10:27:04