3

シナリオ:いくつかの foo.h/foo.c モジュールで分離された foo を提供したいと考えています。この関数は、スレッドセーフな方法で実行できる必要があります。

問題関数内でミューテックス (またはその他のロックの抽象化) を安全に初期化するにはどうすればよいですか? 私はこのようなものを持つことができると思いました:

foo(){
   static pthread_mutex_t *lock=NULL;
   if (lock == NULL){
     lock = init_lock(lock); 
   } 
   //acquire (lock)
   // foo ; 
   //release (lock)
}

しかし、私は実行する必要があります:

if (lock == NULL){
     lock = init_lock(lock); 
   } 

アトミックに、方法がわかりません。

4

1 に答える 1

2

あなたは複雑に考えすぎている

static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

あなたが達成したいことをすることを意味します。

その関数でロックが必要な場合は、静的変数をそこに配置します。複数の関数で必要な場合は、グローバル変数として .c ファイルに配置します。

于 2013-03-10T15:35:57.783 に答える