我无法弄清楚为什么下面的代码导致了分段错误。
如果我删除对pushLock.lock()和.unlock()的调用,它运行正常。
#include <mutex>
#include <queue>
class FunctionQueue{
public:
FunctionQueue();
~FunctionQueue();
void pushInt(int);
private:
std::mutex pushLock;
int currentPushQueue;
std::queue<int> instructionQueues[2];
};
FunctionQueue::FunctionQueue(){
instructionQueues[0] = std::queue<int>();
instructionQueues[1] = std::queue<int>();
// pushLock.unlock();
}
FunctionQueue::~FunctionQueue(){}
void FunctionQueue::pushInt(int newArgument){
pushLock.lock();
instructionQueues[currentPushQueue].push(newArgument);
pushLock.unlock();
}
int main(int argc, char* argv[]){
FunctionQueue testQueue;
testQueue.pushInt(10);
}
gdb BackTrace的输出非常无用:
Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) bt
#0 0x0000000000000000 in ?? ()
#1 0x00007ffff347a291 in ?? () from /lib/x86_64-linux-gnu/libdl.so.2
#2 0x00007ffff347a6d7 in ?? () from /lib/x86_64-linux-gnu/libdl.so.2
#3 0x00007ffff347a198 in dlsym () from /lib/x86_64-linux-gnu/libdl.so.2
#4 0x00007ffff7904b3e in ?? () from /usr/lib/nvidia-331/libGL.so.1
#5 0x00007ffff78e8db4 in ?? () from /usr/lib/nvidia-331/libGL.so.1
#6 0x00007ffff7dea0fd in ?? () from /lib64/ld-linux-x86-64.so.2
#7 0x00007ffff7dea223 in ?? () from /lib64/ld-linux-x86-64.so.2
#8 0x00007ffff7ddb30a in ?? () from /lib64/ld-linux-x86-64.so.2
#9 0x0000000000000001 in ?? ()
#10 0x00007fffffffe8a6 in ?? ()
#11 0x0000000000000000 in ?? ()
你能给予的任何帮助都会很棒。
提前致谢。
答案 0 :(得分:1)
完全删除类中构造函数中已注释掉的代码,因为您没有锁定任何内容,因此首先不应该存在。问题是:
1。您尚未初始化或将成员变量'currentPushQueue'分配给任何值,因此此代码:
instructionQueues[currentPushQueue].push(newArgument);
除非分配了currentPushQueue,否则完全错误。
2。您没有使用互斥锁,因为它们是用于提供的包装器(std :: unique_lock / std :: lock_guard)。
试试此代码并回复:
#include <mutex>
#include <queue>
class FunctionQueue
{
public:
FunctionQueue();
~FunctionQueue();
void pushInt(int);
private:
std::mutex pushLock;
int currentPushQueue = 0; // Set this variable somehow
std::queue<int> instructionQueues[2];
};
FunctionQueue::FunctionQueue()
{
instructionQueues[0] = std::queue<int>();
instructionQueues[1] = std::queue<int>();
}
FunctionQueue::~FunctionQueue() {}
void FunctionQueue::pushInt(int newArgument)
{
std::unique_lock<std::mutex> mutexLock(pushLock);
instructionQueues[currentPushQueue].push(newArgument);
// Unlocks automatically
}
int main(int argc, char* argv[])
{
FunctionQueue testQueue;
testQueue.pushInt(10);
}