ARM上的运行时问题,但在x86上运行良好

时间:2018-11-08 15:22:52

标签: c++ linux multithreading arm pipe

我最近创建了一个在x86 Linux机器上开发的应用程序。基本上,只有两个线程通过pipe()相互通信。线程0在读取端侦听,线程1写入该管道。该程序运行良好。

但是当我将源复制到RaspberryPi并构建它时,存在一些运行时问题(但编译时没有错误)。似乎thread0永远不会从管道中获取任何东西,它只是阻塞。

由于管道是用于进程间通信的,所以我认为它也是线程安全的(因为还有两个不同的文件描述符用于读写端)。

但是:在RPi上的Qt Creator调试器中逐步执行程序,一切似乎都可以正常工作!我知道调试器初始化某些不同的变量会导致这种情况,但是我在代码中找不到未初始化的变量等用法。

线程1:

void *midiThread(void *fds)
{
    midiDevice = ((int*)fds)[0]; // device file for midi input
    midiBuffer = ((int*)fds)[1]; // write end of the pipe

    unsigned char rawBuffer[MIDI_MSG_LENGTH];
    while (read(midiDevice, rawBuffer, MIDI_MSG_LENGTH)
           >= MIDI_MSG_LENGTH)
    {
        struct midievent_t currentEvent;

        unsigned char *rawBuffer = (unsigned char *)buffer;
        currentEvent.channel = rawBuffer[0] & 0x0f;
        // ....

        write(midiBuffer, &currentEvent, sizeof(struct midievent_t));
    }

    close(midiBuffer);
    return NULL;
}

主线程:

void MidiInput::createMidiThread()
{
    if (pipe(_midiBufferPipe) < 0)
    {
        // error
    }

    int fds[2];
    fds[0] = _midiFileDescriptor;
    fds[1] = _midiBufferPipe[1];
    pthread_create(&_midiThreadId, NULL,
                   midiThread, fds);
}

bool MidiInput::read(midievent_t *event)
{
    if (!_initialized)
    {
        return false;
    }

    if (read(_midiBufferPipe[0], event, sizeof(struct midievent_t))
            < sizeof(struct midievent_t))
    {
        // some error
        return _initialized = false;
    }

    return true;
}

0 个答案:

没有答案