【发布时间】:2013-05-29 17:11:53
【问题描述】:
我有一个程序启动一个 std::thread 执行以下操作:睡眠 X,执行一个函数,终止。
create std::thread(Xms, &func)
wait Xms
then do func()
end
我想知道是否可以例如向我的 std::thread 发送一个信号,以便立即中断睡眠并执行 func,然后退出。
我是否需要将信号发送到 std::thread::id 才能执行此操作?
我的线程以这种方式启动,带有一个 lambda 函数:
template<typename T, typename U>
void execAfter(T func, U params, const int ms)
{
std::thread thread([=](){
std::this_thread::sleep_for(std::chrono::milliseconds(ms));
func(params);
});
thread.detach();
}
【问题讨论】:
-
出于好奇:你为什么要等待?
-
@stefan 我实际上是在炸弹人游戏中实现炸弹,它们在 x 次后爆炸,我希望在炸弹爆炸之间实现“连锁反应”。如果炸弹爆炸与另一颗炸弹相撞,她必须立即爆炸,而不是等待 Xms 爆炸。
-
有可能,但很难。 'C++ Concurrency in Action'(第 9.2 章)用了整整 10 页来勾画一个实现并讨论它的缺陷(我不打算在这里重复)。如果 Boost 是一个选项,请考虑使用 boost::thread 来代替 interruptible threads。
-
@Mayerz 我明白了。对我来说,每颗炸弹都有自己的线程似乎不合适。我建议使用并发(或至少是线程安全的)BombHandler,它可以让炸弹在超时或接近另一次爆炸时爆炸。线程创建相当昂贵,所以我会避免每次炸弹都这样做。
-
@ComicSansMS 可悲的是不能使用 Boost,学校项目。 :(
标签: c++ multithreading c++11 signals