每当我需要发送消息时,我都会从线程调用此函数_write_port()。为了确保写入整个消息,使用了tcdrain()。
void Serial_Port::_write_port(char *buf, unsigned &len)
{
// Lock
pthread_mutex_lock(&lock);
// Write packet via serial link
write(fd, buf, len);
// Wait until all data has been written
tcdrain(fd);
// Unlock
pthread_mutex_unlock(&lock);
return;
}
我的问题是tcdrain()在执行此函数_write_port()的随机数后永久阻塞。这将阻止锁定,导致阻塞我的其他读取线程,导致阻塞所有内容。
什么是避免tcdrain永远阻止的好方法?
注意:我奇怪地注意到如果我在整个函数中使用了几个printf(),那么tcdrain永远不会阻塞。因为它们写入不同的输出文件,所以在printf()和write()之间存在关系对我没有任何意义。由于我无法解释这种行为,我认为在我的实验中它可能是这样的巧合。如果有人能解释这种行为,请告诉我。