我的問題很簡單。在Linux下,讀寫串口是線程安全的嗎?我可以同時從不同的線程讀寫嗎?是否可以同時進行2次寫入?我不打算這樣做,但這對其他人可能很有趣。我只有一個讀取線程和另一個寫入線程。串口通信C/C++ Linux線程安全嗎?
很少有人找到關於這個話題。
更多細節我使用write()
和read()
上,我通過open()
獲得的文件描述符;我正在同時這樣做。
謝謝大家!
羅埃爾
我的問題很簡單。在Linux下,讀寫串口是線程安全的嗎?我可以同時從不同的線程讀寫嗎?是否可以同時進行2次寫入?我不打算這樣做,但這對其他人可能很有趣。我只有一個讀取線程和另一個寫入線程。串口通信C/C++ Linux線程安全嗎?
很少有人找到關於這個話題。
更多細節我使用write()
和read()
上,我通過open()
獲得的文件描述符;我正在同時這樣做。
謝謝大家!
羅埃爾
有兩個方面是:
關於內核,我很肯定它會支持這個或者引發一個相應的錯誤,否則這個會很容易被利用。 read()的C實現只是一個系統調用包裝器(請參閱what happens after read is called for a Linux socket),所以這不會改變任何內容。但是,我仍然沒有看到任何記載的保證,所以這是不可靠的。
如果你真的想要兩個線程,我建議你留在stdio函數(fopen/fread/fwrite/fclose)中,因爲在這裏你可以利用glibc在內部同步這些調用與互斥量的事實。
但是,如果您在一個線程中執行阻塞讀取,則可能會阻塞另一個線程等待寫入某些內容。這可能是一個僵局。解決方案是使用select()來檢測何時準備好要讀取的數據或要寫入的緩衝區空間。儘管這是在單線程中完成的,但是當初始代碼稍大時,最終這種方法更簡單和更簡潔,如果涉及多個流,則更加如此。
非常有趣的答案,謝謝。在我的情況下,將會有1個讀線程和1個寫線程。理論上我甚至可以合併這兩個線程。但它是一個整潔的把它放在不同的線程中。從理論上講,我也可以在讀寫功能中添加一個std互斥鎖。然後我不必重寫stdio函數。 – Silver