我的问题很简单。在 Linux 线程下读写串口是否是线程安全的?我可以从不同的线程同时读写吗?甚至可以同时进行 2 次写入吗?我不打算这样做,但这对其他人来说可能很有趣。我只有一个线程可以读取,另一个线程可以写入。
关于这个话题几乎没有什么可找到的。
更多细节——我正在使用write()
和read()
获得的文件描述符open()
;我正在同时这样做。
谢谢大家!
罗尔
我的问题很简单。在 Linux 线程下读写串口是否是线程安全的?我可以从不同的线程同时读写吗?甚至可以同时进行 2 次写入吗?我不打算这样做,但这对其他人来说可能很有趣。我只有一个线程可以读取,另一个线程可以写入。
关于这个话题几乎没有什么可找到的。
更多细节——我正在使用write()
和read()
获得的文件描述符open()
;我正在同时这样做。
谢谢大家!
罗尔
这有两个方面:
关于内核,我很确定它要么支持这一点,要么引发相应的错误,否则这将太容易被利用。read() 的 C 实现只是一个系统调用包装器(看看在 Linux 套接字调用 read 之后会发生什么),所以这不会改变任何东西。但是,我仍然没有看到那里记录的任何保证,所以这是不可靠的。
如果你真的想要两个线程,我建议你继续使用 stdio 函数(fopen/fread/fwrite/fclose),因为在这里你可以利用 glibc 在内部将这些调用与互斥锁同步的事实。
但是,如果您在一个线程中进行阻塞读取,则另一个线程可能会被阻塞以等待写入某些内容。这可能是一个僵局。一个解决方案是使用 select() 来检测何时有一些数据可供读取或缓冲空间可供写入。虽然这是在单个线程中完成的,但是虽然初始代码有点大,但最终这种方法更容易和更清晰,如果涉及多个流则更是如此。