我最近创建了一个在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, ¤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;
}