我是 c++ 的新手,在玩 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++ 版本:
aalen@CFC: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
编译我的代码。并感谢您的关注,对不起我糟糕的英语。
似乎是因为我在 IntervalToCheck 类中使用 GiNaC 并且它不是线程安全的(因为我在 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;
正如 nm 所建议的,来自 gdb。也许 GiNaC 是问题所在。如果有人能提供一个处理表达的开放工具,那就太好了。谢谢阅读。