Проблемы во время выполнения на ARM, но нормально работает на x86 - PullRequest
0 голосов
/ 08 ноября 2018

Я недавно создал приложение, которое разработал на своем компьютере с Linux x86. По сути, это просто два потока, которые общаются по каналу () друг с другом. Поток 0 слушает в конце чтения, а Поток 1 записывает в этот канал. Эта программа прекрасно работала.

Но когда я скопировал исходники в RaspberryPi и собрал его, возникли некоторые проблемы во время выполнения (но скомпилированные без ошибок). Кажется, что thread0 никогда не извлекает что-то из канала, оно просто блокирует.

Так как каналы созданы для межпроцессного взаимодействия, я подумал, что это также будет потокобезопасным (поскольку также есть два разных файловых дескриптора для чтения и записи).

НО: пошагово прогоняя программу в отладчике Qt Creator на RPi, все вроде нормально работает! Я знаю, что отладчик, инициализирующий определенные переменные, может привести к таким условиям, но я не смог найти ни одного использования неинициализированных переменных и т. Д. В моем коде.

нить 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;
}
...