配列の各要素にアクセスするためにミューテックスロックを使用して、構造体の配列のすべての要素をスレッドセーフにしたいと考えています。
これは私の構造です:
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);
}