成员互斥导致SegFault

时间:2015-07-11 22:27:44

标签: c++ segmentation-fault mutex

我无法弄清楚为什么下面的代码导致了分段错误。

如果我删除对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 ?? ()

你能给予的任何帮助都会很棒。

提前致谢。

1 个答案:

答案 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);
}