使用多线程时,指针变量分配复制了部分内存 我尝试多线程C++程序。 我一直在测试我的程序很长时间,有时会得到SIGSEGV(分段错误)。 我发现指针变量只复制了部分内存,而不是全部内存
这是我的部分代码 类别定义使用多线程时,指针变量分配复制了部分内存 我尝试多线程C++程序。 我一直在测试我的程序很长时间,有时会得到SIGSEGV(分段错误)。 我发现指针变量只复制了部分内存,而不是全部内存,c++,multithreading,gcc,C++,Multithreading,Gcc,这是我的部分代码 类别定义 class Message { public: Message() {} virtual ~Message() {} virtual void execute() = 0; //do something... } class Job { public: Job(); ~Job(); void post(Message *message);
class Message
{
public:
Message() {}
virtual ~Message() {}
virtual void execute() = 0; //do something...
}
class Job
{
public:
Job();
~Job();
void post(Message *message);
void execute(Message *message);
private:
Message *_queue[1024] = {nullptr,};
volatile int _head = 0;
int _tail = 0;
};
其中4个线程正在运行并调用同一作业类实例的方法
线程1调用此方法。
void Job::execute(Message *message)
{
if (message != nullptr)
{
int index = __sync_fetch_and_add(&_head, 1) % 1024;
_queue[index] = message;
}
while (_tail != _head)
{
int index = _tail % 1024;
Message *workingMessage = _queue[index];
while (workingMessage == nullptr)
{
sched_yield();
workingMessage = _queue[index];
}
workingMessage->execute();
_queue[index] = nullptr;
++_tail; //this is changed on Thread 1 only!
}
}
void Job::post(Message *message)
{
int index = __sync_fetch_and_add(&_head, 1) % 1024;
_queue[index] = message;
}
线程2~4调用此方法。
void Job::execute(Message *message)
{
if (message != nullptr)
{
int index = __sync_fetch_and_add(&_head, 1) % 1024;
_queue[index] = message;
}
while (_tail != _head)
{
int index = _tail % 1024;
Message *workingMessage = _queue[index];
while (workingMessage == nullptr)
{
sched_yield();
workingMessage = _queue[index];
}
workingMessage->execute();
_queue[index] = nullptr;
++_tail; //this is changed on Thread 1 only!
}
}
void Job::post(Message *message)
{
int index = __sync_fetch_and_add(&_head, 1) % 1024;
_queue[index] = message;
}
几分钟后,线程1的这一部分出现了SIGSEGV崩溃
workingMessage->execute(); // Crash!
在调试器上,workingMessage只有_queue[Index]值的一部分。
比如说,
_queue[index] : 0x7fffdc09abdb
workingMessage : 0xffdc09abdb
或
像这样的案子。
我曾尝试将std::atomic怎么了?我已经在CentOS 7,gcc 4.8.5上编译并测试过了。
\u队列[index]=message
不是原子的。我猜这就是问题所在。但是,如果没有一个完整的可编译示例(a),就没有人能够确定,您需要提供一个完整的可编译示例,以便在主题中考虑这个问题。\u queue[index]=message
不是原子的。我猜这就是问题所在。但是,如果没有一个完整的可编译的示例(a),就没有人能够确定,您需要提供一个完整的示例,以便在这个主题上考虑这个问题。