2015-07-11 116 views
2

我不明白为什么下面的代码导致分段错误。成员互斥导致SegFault

如果我删除了对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回溯输出是非常无益的:

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 ??() 

任何帮助,您可以给将是极好的。

在此先感谢。

+3

'currentPushQueue'哪来的初始化? – Jepessen

+0

你用'-pthread'编译了吗? –

+0

代码疯了。大部分是无意义的噪音。 –

回答

0

在你的类的构造函数中完全删除注释掉的代码,因为你没有锁住任何东西,所以不应该在那里。这个问题是:

你还没有初始化或分配的成员变量“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); 
} 
+0

仍然segFault,有一个几乎相同的回溯(这是太长,不能在这里发布)。 这段代码是为你编译的吗? – DrVonTrap

+2

经过大量的谷歌搜索后,事实证明它实际上与g ++中的一个bug相关,导致我需要在g ++的参数中包含'-Wl, - no-as-needed' – DrVonTrap