如何在C++的低优先级线程中运行方法
How to run a method in a low priority thread in C++?
我正在使用gcc4.7 c ++和linux上的boost。
我有一个使用 boost::signals2 的 EventDispatcher 类,如下所示。onUpdate()
可以由多个线程调用
class EventDispather
{
public:
void subscribe(Listener l)
{
_signal.connect(l)
}
void onUpdate(Data data)
{
_signal(data);
}
private:
boost::signals2::signal<void (Data)> _signal;
};
现在我想在类中添加一个信号来处理一些低优先级侦听器。当 onUpdate() 执行时,它首先通知高优先级侦听器。然后是应该在低优先级线程中调用低优先级线程并立即返回。新代码如下所示:
class EventDispather
{
public:
void subscribe(Listener l, Priority priority=high)
{
if(priority == high)
{
_signal.connect(l);
}
else
{
_signalLowPriority.connect(l);
}
}
void onUpdate(Data data)
{
_signal(data);
//how to trigger _signalLowPriority in a low priority thread?
}
private:
boost::signals2::signal<void (Data)> _signal;
boost::signals2::signal<void (Data)> _signalLowPriority;
};
问题:
- 如何在低优先级线程中触发
_signalLowPriority()
而不等待? - 另外,我不想每次
onUpdate()
执行时都创建一个新线程,而是重用单个线程..如何?
如果我的目标可以在使用标准库和/或提升时完成,那就太好了,但如果它真的有帮助,我可以使用任何其他库。
实现所需内容的最简单方法是将_signalLowPriority
调用发布到 boost::asio::io_service
,该调用在单独的线程中运行。下面是一些(未经测试的)代码:
class EventDispather : enable_shared_from_this<EventDispather> // simplifies lifespan management, wrt async. slot invocations
{
EventDispather() : work_(new io_service::work(io_)) // prevent io_serivce::run() from exiting when running out of work
{
auto self = shared_from_this();
// capturing "self" (even without using it) ensures that this instance will outlive the async. "queue" that uses `io_` and `_signalLowPriority` members
thread th([self, this]() { io_.run(); });
set_priory_with_some_native_api(thread.native_handle());
th.detach();
}
void stop()
{
// after work_ is reset, io_service::run() will process the pending functors and then exit; thus, the above lambda will get destroyed - along with its captured "self" shared_ptr
work_.reset();
}
void onUpdate(Data data)
{
_signal(data);
// if io_ is running in 1 thread, all _signalLowPriority invocations will be serialized
io_.post([data, this]() { _signalLowPriority(data); });
}
private:
io_service io_;
shared_ptr<io_serive::work> work_;
// add here all your signals etc...
};
注意:虽然_signalLowPriority
是线程安全的,但它的插槽必须准备好在单独的线程中调用!
当然,你可以使用thread
、enable_shared_from_this
、shared_ptr
std
或boost
。
相关文章:
- 为什么std::async使用同一个线程运行函数
- 如何在 qt 中从另一个线程运行 qt并发时关闭程序
- 如何使线程运行现有类的函数?C++
- 使用 4 个和 8 个线程运行时执行的时间相等
- 在我调用join()之前,std ::线程运行
- winsock连接调用崩溃如果多个线程运行,则在一个线程中正常工作
- 如何确保这部分代码仅由一个线程运行(在 openmp 中)
- 线程连接在另一个线程运行时会导致分段错误
- 动态提升线程运行存储在具有共享指针的向量中的对象的方法
- 如何启动一个 boost::线程运行一个成员函数
- 如果由另一个 OpenMP 程序调用,则外部调用的 OpenMP 程序仅使用一个线程运行
- 线程运行时间最少
- 计算线程运行的次数
- MySQL C API:从不同线程运行查询时出现分段错误
- 使用两个线程运行和中断一个无限循环
- 与icc 14一起使用多线程运行时库时的错误
- 为什么我得到无限循环只有线程# 0后,所有5个线程运行多线程c++用餐哲学家谜语
- 发布配置上的Visual Studio c++多线程运行时问题
- 使用逻辑线程运行程序
- 为什么设置 CPU 关联会使线程运行速度变慢