の動作は、呼び出されたときstrand::wrap()
に実行されるファンクターを作成するように定義されています。strand::dispatch()
最近、当社のアプリケーションの 1 つで、次のシーケンスを実行するバグに遭遇しました。
my_great_function(..., s.wrap(a), s.wrap(b));
s.wrap(a)
アプリケーションは、 によって作成されたファンクターが の前に呼び出されたことを保証しましたs.wrap(b)
。ただし、最初のファンクターがストランドの外部で呼び出されるため、呼び出しが延期され、2 番目のファンクターがストランドの内部で呼び出されてすぐに実行されるという競合状態があります。a
これは、以前のアプリケーションの順序付けの仮定に違反し、b
未定義の動作をもたらしました。
strand::post()
代わりに を使用strand::dispatch()
することは、これを解決する 1 つの方法ですが、 を使用するような簡単な方法はありませんstrand.wrap()
。ストランドを介して投稿するヘルパー関数を作成できますが、もっと簡単な方法があるかどうか疑問に思っています。