如何避免 tcdrain() 永远阻塞

jos*_*ose 6 c++ io serial-port nonblocking blocking

每当我需要发送消息时,我都会从线程调用这个函数 _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;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是 tcdrain() 在执行随机次数的函数 _write_port() 后永远阻塞。这将阻塞锁,导致阻塞我的其他读取线程,从而阻塞所有内容。

避免 tcdrain 永远阻塞的好方法是什么?


注意:我奇怪地注意到,如果我在整个函数中使用多个 printf(),tcdrain 永远不会阻塞。printf() 和 write() 之间存在关系对我来说没有任何意义,因为它们写入不同的输出文件。由于我无法解释这种行为,我认为它在我的实验中如此工作可能是巧合。如果有人可以解释这种行为,请告诉我。