【问题标题】:Serial communication C/C++ Linux thread safe?串行通信 C/C++ Linux 线程安全吗?
【发布时间】:2013-03-28 15:51:10
【问题描述】:

我的问题很简单。在 Linux 下读写串口是线程安全的吗?我可以从不同的线程同时读写吗?甚至可以同时进行 2 次写入吗?我不打算这样做,但这对其他人来说可能很有趣。我只有一个线程读取和另一个写入。

关于这个主题的内容很少。

更多细节——我在open()获得的文件描述符上使用write()read();我正在同时这样做。

谢谢大家!

罗尔

【问题讨论】:

    标签: c linux multithreading thread-safety serial-communication


    【解决方案1】:

    这有两个方面:

    1. C 实现的作用。
    2. 内核的作用。

    关于内核,我很确定它要么支持这一点,要么引发相应的错误,否则这将太容易被利用。 read() 的 C 实现只是一个系统调用包装器(参见what happens after read is called for a Linux socket),所以这不会改变任何东西。但是,我仍然没有看到那里记录的任何保证,所以这是不可靠的。

    如果您真的想要两个线程,我建议您使用 stdio 函数 (fopen/fread/fwrite/fclose),因为在这里您可以利用 glibc 在内部将这些调用与互斥锁同步的事实。

    但是,如果您在一个线程中执行阻塞读取,则另一个线程可能会被阻塞等待写入内容。这可能是一个僵局。一种解决方案是使用 select() 来检测何时有一些数据可供读取或缓冲空间可供写入。虽然这是在单个线程中完成的,但是虽然初始代码有点大,但最终这种方法更容易和更清晰,如果涉及多个流则更是如此。

    【讨论】:

    • 非常有趣的答案,谢谢。就我而言,将有 1 个读取线程和 1 个写入线程。理论上我什至可以合并这两个线程。但是将它放在单独的线程中会更整洁一些。理论上,我还可以在读写函数周围放置一个标准互斥锁。那我就不用重写stdio函数了。
    猜你喜欢
    • 1970-01-01
    • 2013-08-23
    • 2019-09-20
    • 2021-01-15
    • 2017-11-15
    • 1970-01-01
    • 2013-06-30
    • 2010-11-24
    相关资源
    最近更新 更多