串口通讯C / C ++ Linux线程安全吗?

时间:2013-03-28 15:51:10

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

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

关于这个话题几乎找不到。

详细信息 - 我在write()获取的文件描述符上使用read()open();我同时这样做。

全部谢谢!

罗埃尔

1 个答案:

答案 0 :(得分:3)

这有两个方面:

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

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

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