串行通信 C/C++ Linux 线程安全吗?

Sil*_*ver 5 c linux multithreading serial-communication thread-safety

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

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

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

谢谢大家!

罗尔

Ulr*_*rdt 3

这有两个方面:

  1. C 实现的作用。
  2. 内核做了什么。

关于内核,我非常确定它将支持此功能或引发相应的错误,否则这将很容易被利用。C 实现read()只是一个系统调用包装器(看看为 Linux 套接字调用 read 后会发生什么),所以这不会改变任何东西。但是,我仍然没有看到任何保证记录在那里,所以这是不可靠的。

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

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