GLib/GObject を使用していますが、次の問題に直面しています。
my_class
実行時に複数のスレッドに複数のオブジェクト インスタンスを持つクラスがあり、各オブジェクトは 1 つのスレッド内に存在します (したがって、スレッドとオブジェクトの間には 1:1 の関係があります)。
ただし、オブジェクトは共有リソースにアクセスするため、そのリソースへのアクセスを保護するためにロックする必要があります。GMutex
ここで、ロックするすべてのスレッド/オブジェクトで使用できるグローバル ミューテックス (GLib ワールドの 1 つ) インスタンスが必要です。
私の現在のアプローチは、スレッドが生成される前にそのミューテックスを作成し、そのグローバル ミューテックスをコンストラクターに渡すことです。しかし、私はそのアプローチが好きではありません。ミューテックスは、スレッドを作成する前の呼び出しコードには関係ありません。これは、 による機能のためにのみ必要であり、そのため、クリーンな OO 設計のmy_class
一部である必要があります。my_class
しかし、内部から単一のミューテックスを作成する方法はmy_class
? を作成しstatic GMutex *global_mutex
てグローバル変数として保持し、すべてのスレッドで共有できます。しかし、いつ/どのように電話するのg_mutex_new()
ですか? のコンストラクターに入れたいのですmy_class
が、コードを実行する必要があるのは 1 回だけです。これを実現するには、まずロックする必要があり、ニワトリが先か卵が先かという問題に直面しています。