1

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 回だけです。これを実現するには、まずロックする必要があり、ニワトリが先か卵が先かという問題に直面しています。

4

1 に答える 1

2

あなたが欲しいのはですGStaticMutex。スレッド関数で静的ローカル変数として宣言し、次のように初期化しますG_STATIC_MUTEX_INIT

static GStaticMutex my_mutex = G_STATIC_MUTEX_INIT;

これはミューテックスを宣言、定義、および初期化するため、直接使用できます。

リンクされた参照の例を参照してください。

于 2013-10-23T08:20:38.973 に答える