我在 Boost::ASIO 和canary之上實作了一個 J1939 套接字處理程式。我以前的應用程式有一個套接字來監聽設備,并且發現的每個設備也都有一個套接字。每個套接字將使用相同的介面(在本例中為 can0)。根據我對SocketCan和J1939的理解,這是正確的方法。因為每個套接字都可以應用過濾器以僅從其偵聽的設備獲取訊息。
在我當前的應用程式中,我async_read
在兩個套接字上進行了測驗,兩個執行緒正在執行io_context.run()
。從日志來看,這似乎非常好。我猜這是因為內核在傳遞資料之前會檢查每個套接字上的過濾器。但是,async_write
我對執行緒安全性更加不確定。
鑒于所有套接字都具有相同的介面(can0),這些套接字是否需要共享一個鏈?還是每個套接字處理程式中的一條線就足夠了?或者內核中是否存在一些同步,這意味著寫入 CAN 總線是執行緒安全的。
uj5u.com熱心網友回復:
是的,內核中有同步。例如,TCP 套接字也會發生同樣的情況。它們還共享一個網路介面(如 eth0)。linux 網路子系統確保不同的套接字(由不同的執行緒甚至行程使用)可以共享一個介面而不會發生沖突。如果同時從多個執行緒訪問一個套接字,則只需要同步。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/470138.html
上一篇:獲取目錄大小的最快方法是什么?