1

配列の各要素にアクセスするためにミューテックスロックを使用して、構造体の配列のすべての要素をスレッドセーフにしたいと考えています。

これは私の構造です:

typedef struct {
  void      *value;
  void      *key;
  uint32_t  value_length;
  uint32_t  key_length;
  uint64_t  access_count;
  void      *next;
  pthread_mutex_t *mutex;
} lruc_item;

この構造体の配列があり、構造体要素をスレッド セーフにするためにミューテックス ロックを使用したいと考えています。

関数内の配列要素の1つでロックを使用しようとしましたが、ロックが正常に機能していることを確認するために、意図的にロックを解除しませんでしたが、奇妙なことに、デッドロックがなく、2番目の関数が同じ要素にアクセスしていました配列要素はそれにアクセスできました。

ミューテックスを使用して構造体配列のすべての要素をロックする方法を教えてください(構造体の各要素をスレッドセーフにするため)。

私のポイントを説明するサンプルコード:

/** FUNCTION THAT CREATES ELEMENTS OF THE STRUCTURE **/

lruc_item *create_item(lruc *cache) {
  lruc_item *item = NULL;

item = (lruc_item *) calloc(sizeof(lruc_item), 1);

item->mutex = (pthread_mutex_t *) malloc(sizeof(pthread_mutex_t));
  if(pthread_mutex_init(item->mutex, NULL)) {
    perror("LRU Cache unable to initialise mutex for page");
    return NULL;
     }

  }

 return item;
}


set()
{
item = create_item(cache);

  pthread_mutex_lock(item->mutex);
    item->value = value;
    item->key = key;
    item->value_length = value_length;
    item->key_length = key_length;
    item->access_count = ++cache->access_count;

  pthread_mutex_unlock(item->mutex);     /** (LINE P) tried commenting out this to check  proper working of mutex(deadlock expected if the same "item" is accessed in another function)  **/


}

get(lruc_item *item)
{

  pthread_mutex_lock(item->mutex);   /** deadlock doesn't occur when "LINE P" is commented out**/ 
    *value = item->value;
    item->access_count = ++cache->access_count;
  pthread_mutex_unlock(item->mutex);

}
4

1 に答える 1

0

ミューテックスは他のスレッドからコードをロックアウトするだけであることに注意することが重要です。 同じスレッドで同じミューテックスを使用して実行しようとすると、ブロックされません。WaitForMultipleObjectsあなたはそれについて詳しく説明していないので、私はWindowsを想定しています。

しかし、より詳細な情報を提供していただければ、問題が実際にどこにあるかを特定できるかもしれません。

ここで、再び Windows を想定して、個々の要素へのアクセスを「スレッドセーフ」にしたい場合InterlockedExchangeは、ミューテックスの代わりに関数のクラスを検討することをお勧めします。例えば:

InterlockExchange(&s.value_length, newValue);

また

InterlockedExchange64(&s.access_count, new64Value);

また

InterlockedExchangePointer(&s.value, newPointer);

あなたがしたいことが、構造体への複数の要素アクセスがトランザクションとしてスレッドセーフであることを確認することである場合、mutex がそれを行うことができます。Mutex は、プロセスの境界を越えて役立ちます。単一のプロセス内でのみ処理している場合は、クリティカル セクションを使用することをお勧めします。

于 2012-08-10T18:55:19.320 に答える