Lil*_*ily 5 c++ multithreading boost signals-slots
我在Stackoverflow上经历了类似的问题,但仍然无法得到很好的答案:
我对如何实现此信号/插槽感到非常困惑。
Q1:从下面的代码,sig连接到两个函数(Hello()和World()),似乎这些函数是以序列化的方式调用的,这还意味着一个函数(Hello())需要在进入另一个函数(World())之前完成?=>单线程程序
Q2:反正有启用多线程信号/插槽吗?(=> World()将立即启动,不需要等待Hello()完成。)或者,如果不建议这样做,您可以告诉我为什么?
struct Hello
{
void operator()() const { std::cout << "Hello";}
};
struct World
{
void operator()() const { std::cout << ", World!" << std::endl;}
};
boost::signal<void ()> sig;
sig.connect(Hello());
sig.connect(World());
sig();
Run Code Online (Sandbox Code Playgroud)
输出:世界,您好!
Q1:
调用是串行的。信号在内部所做的事情被大大简化了:
foreach connection:
call handler
Run Code Online (Sandbox Code Playgroud)
因此,您不想长时间阻塞处理程序。如果您需要做很多工作,您可以从那里调用它,例如为其创建一个线程。
Q2:
Boost 信号 1 甚至不是线程安全的;信号 2 是,但仍然进行序列化调用。由于信号主要用于事件处理,因此在处理程序中实际上不做太多工作是常见的风格。
因此,“并行”调用它们并没有真正的好处,这些好处通常不会证明必要的线程调用的开销是合理的。
| 归档时间: |
|
| 查看次数: |
4114 次 |
| 最近记录: |