【问题标题】:Mutex for every element in a structure array结构数组中每个元素的互斥锁
【发布时间】:2012-08-10 18:41:54
【问题描述】:

我想通过使用互斥锁访问数组的每个元素来使结构数组中的每个元素都成为线程安全的。

这是我的结构:

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;

我有一个这种结构的数组,并且想使用互斥锁来使结构元素线程安全。

我尝试在函数中的一个数组元素上使用锁,然后故意没有解锁它,只是为了确保我的锁工作正常,但奇怪的是没有死锁和第二个函数访问相同的数组元素可以访问它。

有人可以指导我如何使用互斥锁来锁定结构数组中的每个元素(以使结构线程的每个元素都安全)。

解释我的观点的示例代码:

/** 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);

}

【问题讨论】:

  • 你能在你使用互斥锁的地方显示一些代码吗?
  • 为什么你有mutex作为一个指针,而不是直接作为一个pthread_mutex_t?分配*mutex 似乎使您的生活复杂化。
  • 前提是有缺陷的,无论它看起来如何。互斥体阻塞代码,它不锁定数据。
  • 我已经发布了一些相关代码。
  • 在调试器中,或者通过打印,是否验证了这两个项目是同一个项目?

标签: c linux multithreading structure mutex


【解决方案1】:

请务必注意,互斥锁只会锁定来自其他线程的代码。 如果您尝试在同一线程中使用相同的互斥锁执行WaitForMultipleObjects,它不会阻塞。我假设是 Windows,因为你没有详细说明。

但是,如果您提供更多详细信息,也许我们可以查明问题的真正所在。

现在,再次假设 Windows,如果您想访问 单个元素“线程安全”,您可能需要考虑 InterlockedExchange-class 函数而不是互斥体。例如:

InterlockExchange(&s.value_length, newValue);

或

InterlockedExchange64(&s.access_count, new64Value);

或

InterlockedExchangePointer(&s.value, newPointer);

如果您要做的是确保对结构的多个元素访问(作为事务)是线程安全的,那么互斥锁可以为您做到这一点。 Mutex 在跨进程边界时很有用。如果您只处理单个进程,那么关键部分可能是一个更好的主意。

【讨论】:

  • 它在linux系统上,它是一个互斥锁而不是一个信号量,它可以允许多次访问锁定的代码。让我包含一些示例代码,以使其清楚。
  • 在这种情况下,请忽略有关 Windows 特定功能的所有细节。关于在其他线程中运行的仅互斥锁块代码的注释仍然是正确的;但是,如果您发布代码,可能会更清楚问题所在。
  • 在 Linux 上,互斥体基本上相当于 Windows 上的临界区。它小而快。
猜你喜欢
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
相关资源
最近更新 更多