gpt4 book ai didi

c++ - 成员互斥导致SegFault

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:17:32 26 4
gpt4 key购买 nike

我不明白为什么下面的代码会导致段错误。

如果我删除对 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.您尚未初始化成员变量“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);
}

关于c++ - 成员互斥导致SegFault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31362451/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com