使用 C++11 线程的分段错误(核心转储)
segmentation fault (core dumped) with c++11 thread
我是 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"是流的对象。 奇怪的是,当我将"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 并且它不是线程安全的(因为我在谷歌上搜索了 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;
正如 N.m 所建议的那样来自 gdb。 也许GiNaC是问题所在。如果有人能提供一个开放的工具来处理表达,那就太好了。感谢阅读。
如果你看一下分段错误来自哪里的源代码,你可以看到它来自 GiNaC 的引用计数指针的实现。据我了解,问题在于,当另一个线程仍在使用它时,指针可能会被过早删除。这是因为计数器上的递增和递减操作在线程访问方面不是原子的。因此,您正在尝试访问已删除的内存,这是未定义的行为(因此可以分段错误(。
实际上,这个问题似乎在过去已经出现过,并且他们的邮件列表中表达了这种担忧。
根据其维护者的说法,GiNaC 不是线程安全的。
因此,您根本无法按照维护者的预期从多个线程使用 GiNaC。
从理论上讲,也许你可以用类似 std::shared_ptr
的东西替换ginac::ptr
,它保证没有关于其引用计数机制的竞争条件。因此,如果您可以将内部计数器类型替换为std::atomic<int>
或类似的东西,或者您可以另一个具有原子引用计数的实现,则该程序可能会起作用。
至于你写的实际代码,它似乎应该可以正常工作。尽管 print 语句可以按顺序执行和交错,但它们似乎被正确锁定在关键块中,尽管最好在 C++ 中使用更惯用的、RAII 增强的std::scoped_lock
。
- 如何找出GDB的SIGTRAP核心转储的根本原因
- C++映射分割错误(核心转储)
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 浮点异常(核心转储)#694457
- 分段错误(核心转储)但无法弄清楚
- 链接到libkcapi时没有核心转储
- 分段错误(核心转储) - 使用 SavedModel 的 Tensorflow C++ API 进行推断
- 在基数排序中,我得到 munmap_chunk():无效指针和中止(核心转储).为什么?
- C++指针无法在函数外部传递值和分段错误(核心转储)错误
- 合并排序:分段错误核心转储
- C++:分段错误(核心转储)
- 从 pybind11 构建导入模块时出现"分段错误(核心转储)"
- 如何使用 lldb 在曼扎罗中调试 lz4 文件格式的核心转储?
- qt C++命令行代码中的分段错误(核心转储)
- 从文件中读取的数据,但发生核心转储错误
- googletest:测试基类具有纯虚拟方法的派生类时的核心转储
- C++ atof - 分段错误(核心转储)
- Linux C 只禁止我的程序使用核心转储
- 为什么我的代码包含错误分段错误(核心转储)?