【发布时间】:2021-05-19 11:50:48
【问题描述】:
我有 4 个传感器,我想在 4 个不同的线程中异步轮询它们。我有一个计时器,它会以 30Hz 的频率调用一个函数,我希望这个函数能够触发线程内的轮询。
我尝试使用std::async 来在每次定时器调用时产生 4 个线程,但创建线程的开销太大。这是我对std::async 所做的:
for (auto& camera : camera_vector_) {
camera_asyncs_.emplace_back(
std::async(std::launch::async, [camera]() -> bool {
return camera->poll();
})
);
}
for (auto& future : camera_asyncs_) {
future.get();
}
现在我需要在程序开始时生成 4 个线程,并等待时钟告诉它们解锁并运行进程功能。像这样:
for (auto& camera : camera_vector_)
{
camera_threads_.emplace_back(std::thread([&camera]() {
while (true)
{
wait_for_trigger();
camera->poll();
block_trigger();
}
}));
}
void Driver::poll_threads() {
for (auto& thread : camera_threads_) {
trigger_thread(thread);
}
}
你会怎么做呢?我的研究使我想到了互斥体和条件变量。例如here。但是我发现的例子是启动一堆线程并让它们完成。不要一次在一个线程中触发一个循环。
另外,我这里需要的似乎不是线程池,因为每个线程都是一个定义的作业,只需要一个触发器。我说的对吗?
在我看来,使用互斥锁是正确的做法。我应该将它们存储在与我的线程向量相同大小的第二个向量中吗?我知道我可以在线程内锁定互斥锁,但我可以从主线程解锁互斥锁吗?你有什么实现这一点的技巧吗?
我正在使用 C++14。
感谢您的帮助。
【问题讨论】:
-
那么当定时器触发时,会产生另外四个新线程?
-
在线程内部执行等待不是更有意义吗,否则主线程仍然为向线程发出信号而烦恼?
-
@Yves 理想情况下不是,我希望线程等待触发器。
-
看来你需要的确实是一个线程池。它将允许您保持 4 个线程处于活动状态并在必要时唤醒它们(当您给线程池一个要执行的任务时)。但是对于互斥量和条件变量,这基本上是一样的:)
-
@Fareanor 什么是最简单的?有什么推荐吗?那我应该有一个互斥锁吗?
标签: c++ multithreading c++14