如何避免tcdrain()永远阻塞

时间:2015-06-27 01:20:11

标签: c++ io serial-port blocking nonblocking

每当我需要发送消息时,我都会从线程调用此函数_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()之间存在关系对我没有任何意义。由于我无法解释这种行为,我认为在我的实验中它可能是这样的巧合。如果有人能解释这种行为,请告诉我。

0 个答案:

没有答案