Я недавно создал приложение, которое разработал на своем компьютере с 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, ¤tEvent, 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;
}