std::lock_guard<std::mutex> 施工上的段错误?
std::lock_guard<std::mutex> segfaults on construction?
我正试图使用std::mutex和std::lock_guard访问共享std::队列。互斥对象(pending_md_mtx_)是另一个对象(其地址有效)的成员变量。我的代码似乎在构建lock_guard。
有什么想法吗?我应该使用std::unique_lock(或其他对象)吗?在Ubuntu Linux下运行GCC 4.6(--std=c++0x)。我不能发布整个类,但只能访问下面列出的互斥对象和队列。
template <typename ListenerT>
class Driver
{
public:
template <typename... Args>
Driver(Args&&... args) :
listener_(std::forward<Args>(args)...) {}
void enqueue_md(netw::Packet* packet)
{
std::lock_guard<std::mutex> lock(pending_md_mtx_);
pending_md_.push(packet);
}
void process_md()
{
std::lock_guard<std::mutex> lock(pending_md_mtx_);
while (pending_md_.size())
{
netw::Packet* pkt=pending_md_.front();
pending_md_.pop();
process_md(*pkt);
}
}
//... Other code which I can't post...
private:
ListenerT listener_;
std::mutex pending_md_mtx_;
std::queue<netw::Packet*> pending_md_;
};
GDB Stacktrace:
(gdb) bt
#0 __pthread_mutex_lock (mutex=0x2f20aa75e6f4000) at pthread_mutex_lock.c:50
#1 0x000000000041a2dc in __gthread_mutex_lock (__mutex=0xff282ceacb40) at /usr/include/c++/4.6/x86_64-linux-gnu/./bits/gthr-default.h:742
#2 lock (this=0xff282ceacb40) at /usr/include/c++/4.6/mutex:90
#3 lock_guard (__m=..., this=0x7f2874fc4db0) at /usr/include/c++/4.6/mutex:445
#4 driver::Driver<Listener, false>::enqueue_md (this=0xff282ceac8a0, packet=...) at exec/../../driver/Driver.hpp:95
我在构造std::lock_guard
时遇到了一个segfault,结果发现我的代码使用了一个未初始化的std::shared_ptr<my_object_with_mutex>
。使用适当构造的my_object_with_mutex
解决了这个问题。
我最近遇到了这个问题。这是由获取锁后导致缓冲区溢出的代码行引起的。锁下面的一行代码在几行之前导致问题,这似乎很奇怪,但我认为缓冲区溢出会导致一些损坏,从而在第二次调用函数时导致问题。
我的案例中的问题根本原因:
- 对象A引用对象B
- 在调用对象
B.func()
时,我在lock_guard上看到SegFault - 从未为对象A设置过对象B(未初始化,为NULL指针),导致访问字段时出现SegFault(在我的情况下是互斥对象)
注意this=0x0
:可以从GDB中诊断错误
...
#4 0x000055e3a9e14a3c in B<C>::write (this=0x4e2280, msg=0x55e3aac03be0) at /proj/B.hpp:35
#5 0x000055e3a9e206e6 in A::write (this=0x0, msg=0x55e3aac03be0) at /proj/A.cpp:286
#6 0x000055e3a9e2069a in A::write (this=0x7f21eae64010, msg=0x55e3aac03be0) at /proj/A.cpp:277
...
在我的案例中,根本原因是相同的(互斥对象未初始化),但原因并非如此。
具有互斥对象的对象具有函数reset
。你猜怎么着,shared_ptr
还有一个名为reset
的函数,我改为调用它!
避免使用reset
作为名称,或者仔细检查是否使用obj.reset()
而不是obj->reset()
!
相关文章:
- 为什么我的类 std::vector 成员总是抛出段错误?
- 引用 std::cout 会导致段错误
- 分配 std::函数会导致段错误
- 返回对 std::函数包装的 lambda 中静态变量的引用会导致段错误
- 添加到 std::shared_ptr 的向量会导致段错误
- std::stoi 会导致段错误
- 当使用固定大小矩阵的“std::vector”时,常春藤桥上的 AVX 的特征段错误
- 为什么<char>我的重载流运算符上出现 std::basic_string 段错误?
- std::cout 可防止功能中的段错误
- 带有对象的段错误set_union:std::set<CardSet>
- std::堆栈<T>在 Eclipse 中调试时导致段错误
- C++ 段错误 访问对象指针向量的 std::vector.size()
- std::lock_guard<std::mutex> 施工上的段错误?
- 使用 std::complex <double>时使用 GCC4.9.1 的段错误
- C++ std::vector<std::string> 迭代器段错误
- 一个简单的std::shared_ptr构造案例的段错误
- OS X上的std::locale段错误,不能在任何其他平台上重现
- 在段错误时,std::ofstream是否正确关闭
- 将一个std::字符串复制到另一个时出现段错误
- 使用std::set指针时出现段错误.有人能解释一下吗?