2

別のスレッドでタスクを実行する C++ マルチスレッド アプリケーションがあります。各タスクには、その出力を処理および保存するオブジェクトがあります。各タスクは、異なるビジネス ロジック オブジェクトを作成し、おそらく別のスレッドまたはスレッドプールを作成します。

私がやりたいことは、タスクによって実行されるビジネス ロジック オブジェクトが、手動で「出力」オブジェクトを各ビジネス ロジック オブジェクトに渡すことなく、各タスクの出力にアクセスする簡単な方法を提供することです。

私が見ているのは、出力シングルトン ファクトリを作成し、task_id を TLS に格納することです。しかし問題は、ビジネス ロジックが新しいスレッドまたはスレッド プールを作成し、それらのスレッドが TLS に task_id を持たない場合です。このようにして、親のスレッド TLS にアクセスする必要があります。

もう 1 つの方法は、タスクの開始以降のすべての出力を単純に取得することです。その間に別のタスクからの出力がありますが、少なくとも何もないよりはましです...

私の問題を解決するためのクリーンできれいな方法の提案やアイデアを探しています。ありがとう。

更新:ええ、それはシングルトーンではありません。同意します。このオブジェクトに次のようにアクセスできるようにしたいだけです。

output << "message";

以上です。ビジネス ロジック クラス間で出力オブジェクトへのポインターを渡す心配はありません。タスクごとにグローバル出力オブジェクトが必要です。

4

2 に答える 2

1

アプリケーションの観点からは、オブジェクトはシングルトンではないのに、なぜオブジェクトをシングルトンのように扱うのでしょうか?

出力ストアの新しいインスタンスを作成し、(賢い?) ポインターを新しいスレッドに渡します。メイン関数はポインタを TLS に入れることができるため、インスタンスはスレッドごとにグローバルになります (これは賢明な設計上の決定ではないと思いますが、尋ねられます)。新しい (サブ?) スレッドを作成するときに、ポインタを再び渡すことができます。したがって、私によると、シングルトンやファクトリーは必要ありません。

于 2012-12-06T16:13:28.797 に答える
0

私があなたを正しく理解していれば、複数のクラスインスタンス (それぞれが同じクラスである必要はありません) がすべて、スレッドセーフである必要がある共通のデータプールにアクセスできるようにする必要があります。これを行う方法はいくつか考えられます。最初のアイデアは、他の各クラスに含まれるクラスにこのデータ プールを配置することです。このデータ プールは実際にはそのデータを静的メンバーに格納するため、データ プール クラスのインスタンスが複数存在する場合でも、データのインスタンスは 1 つだけになります。クラスには、この静的データ プールにアクセスするアクセサ メソッドがあります (透過的であるため)。スレッドセーフにするには、ミューテックスなどを介してアクセスする必要があります。

于 2012-12-06T16:18:15.057 に答える