6

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

4

2 に答える 2

9

Boost.Signalsでは、スロットは同期的に呼び出され、同じシグナルに接続されたスロットは追加された順に呼び出されます。これは、スレッドセーフなバリアントであるBoost.Signals2にも当てはまります。

于 2013-02-08T12:59:38.967 に答える
0

これは「HelloWorldFoo」を出力するはずですが、複数の接続されたスロットへの呼び出しの順序がAFAIKで定義されていないため、合法的に「WorldHelloFoo」を出力できます。

厳密な順序が必要な場合は、次の構文を使用してください。

sig.connect(1, World());
sig.connect(0, Hello());
于 2013-02-08T12:43:32.323 に答える