Вызываются ли слоты boost :: signal синхронно или асинхронно?

Может кто-нибудь сказать мне, boost::signals Слоты вызываются синхронно или асинхронно?

Например, у меня есть этот кусок кода:

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();

cout << "Foo";

Как работает поток выполнения? Ожидание исполнения Hello() а также World() выполнить и сразу после этого "Foo" печатается или вызывает их асинхронно (печать «Foo» и вызов Hello() а также World() выполнить в неопределенном порядке)?

6

Решение

В Boost.Signals Слоты вызываются синхронно, а слоты, подключенные к одному и тому же сигналу, вызываются в том порядке, в котором они были добавлены. Это верно и для многопоточного варианта, Boost.Signals2

8

Другие решения

Это должно вывести «Hello World Foo», но может на законных основаниях вывести «World Hello Foo», потому что порядок вызовов для нескольких подключенных слотов не определен AFAIK.

Если вы хотите строгий порядок, используйте этот синтаксис:

sig.connect(1, World());
sig.connect(0, Hello());
0

По вопросам рекламы [email protected]