我正在尝试使用std :: mutex和std :: lock_guard访问共享的std :: queue。互斥锁(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
答案 0 :(得分:1)
我在构建std::lock_guard
时遇到了段错误,结果发现我的代码使用了未初始化的std::shared_ptr<my_object_with_mutex>
。使用正确构造的my_object_with_mutex
可以解决问题。
答案 1 :(得分:0)
我最近遇到过这个问题。这是由获取锁定后导致缓冲区溢出的代码行引起的。锁定下面的一行代码导致问题出现几行似乎很奇怪,但我认为缓冲区溢出会导致一些损坏,导致第二次调用该函数时出现问题。
答案 2 :(得分:0)
在我的案例中的问题根源:
通过注意到 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
...