Boost Asio J1939 / Can-bus 多线程

Boost Asio J1939 / Can-bus Multithreading

我正在 Boost::ASIO 和 canary. My previous application had a socket to listen for devices and the each device discovered would also have a socket. Each socket would use the same interface (In this case can0). From my understanding of SocketCan and J1939 之上实现 J1939 套接字处理程序,这是正确的方法。由于每个套接字都可以应用过滤器以仅从其侦听的设备获取消息。

在我当前的应用程序中,我已经在两个套接字上测试了 async_read,两个线程执行 io_context.run()。从日志来看,这似乎非常好。我猜这是因为内核在传递数据之前会检查每个套接字上的过滤器。但是,对于 async_write,我对线程安全性更加不确定。

鉴于所有套接字都具有相同的接口 (can0),这些套接字是否需要共享一个链?还是每个套接字处理程序中的一条线就足够了?或者内核中是否存在某种同步,这意味着写入 CAN 总线是线程安全的。

是的,内核中有同步。例如,TCP 套接字也会发生同样的情况。它们还共享一个网络接口(如 eth0)。 linux 网络子系统确保不同的套接字(由不同的线程甚至进程使用)可以共享一个接口而不会发生冲突。如果同时从多个线程访问一个套接字,则只需要同步。