使用多线程时,指针变量分配复制了部分内存 我尝试多线程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用于_queue和workingMessage,同样的崩溃也发生过


怎么了?我已经在CentOS 7,gcc 4.8.5上编译并测试过了。

\u队列[index]=message
不是原子的。我猜这就是问题所在。但是,如果没有一个完整的可编译示例(a),就没有人能够确定,您需要提供一个完整的可编译示例,以便在主题中考虑这个问题。
\u queue[index]=message
不是原子的。我猜这就是问题所在。但是,如果没有一个完整的可编译的示例(a),就没有人能够确定,您需要提供一个完整的示例,以便在这个主题上考虑这个问题。