【发布时间】:2020-04-12 06:21:02
【问题描述】:
我正在研究 ROS 环境,并尝试在并行线程上读取 CANBUS。我在主线程中初始化了 canbus,因为我想确保 CAN 电缆已连接。通过初始化,我的意思是setsockopt()、ioctl()、bind() 来配置套接字。
void readCanbus(int soktId) {
while(true)
int nbytes = read(soktId, ...);
}
int main() {
int soktId;
someSocketSetupFn(soktId);
std::thread t(readCanbus, soktId);
t.join();
}
问题:如果没有传入的 CAN 消息,read() 被阻止。 Ctrl+C 不会终止 C++11 程序。
我怎样才能让read() 终止并让整个程序终止?
Terminate thread c++11 blocked on read 这篇文章为 POSIX 提出了一个解决方案。我正在开发 ubuntu16.04。
【问题讨论】:
-
如果您将套接字设置为非阻塞模式,并在
select()(或poll(),或类似的)内阻塞,您可以使用自管道技巧来导致 select()/当您的信号处理程序向其管道发送一个字节时,轮询唤醒,然后您的线程可以退出。 -
如果socket设置为非阻塞,也可以通过ioctl -- ioctl(socketfd, FIONREAD, &status);判断是否没有传入消息如果状态> 0,则有数据,否则没有。
-
这就是为什么我们不使用阻塞 I/O....
-
好主意@Jeremy,但请在适当的地方写下答案,因为这不是聊天室,谢谢
-
@JeremyFriesner。谢谢你的建议。如果你不介意可以分享一些代码sn-ps ..
标签: c++ multithreading io ros can-bus