我正在Boost::ASIO和金丝雀之上实现一个金丝雀套接字处理程序。我以前的应用程序有一个套接字来侦听设备,发现的每个设备都有一个套接字。每个套接字将使用相同的接口(在本例中为can0)。根据我对SocketCan和J1939的理解,这是正确的方法。因为每个套接字都可以应用过滤器,只能从侦听设备获取消息。
在我的当前应用程序中,我已经在两个套接字上测试了async_read,其中两个线程正在执行io_context.run()。从日志上看,这似乎是非常好的。我猜这是因为内核在传递数据之前对每个套接字上的过滤器进行检查。然而,有了async_write,我对线程安全就更加不确定了。
假设所有的套接字都有相同的接口(can0),那么套接字需要共享一条链吗?还是每个套接字处理程序中的一条链足够了?或者内核中是否存在某种同步,这意味着写入CAN总线是线程安全的。
发布于 2022-05-03 13:54:51
是的,内核中存在同步。例如,TCP套接字也是如此。他们还共享一个单一的网络接口(如eth0)。linux网络子系统确保不同的套接字(由不同的线程甚至进程使用)可以共享一个接口而不发生冲突。只有同时从多个线程访问一个套接字时,才需要同步。
https://stackoverflow.com/questions/72100278
复制相似问题