【问题标题】:Fine grained locking in CC中的细粒度锁定
【发布时间】:2013-05-27 13:04:57
【问题描述】:

我有这个交换元素的代码:

   atomic{
       int temp = a[i];
       a[i] =a[j];
       a[j] = temp;
  }

我将如何使用细粒度锁定来实现这一点以达到相同的效果?

【问题讨论】:

  • 那是什么语言?
  • 你用什么库来并行化?
  • 我认为它只是原子操作的通用版本。我在一份试卷中看到了它,他们要求提供它的细粒度锁定版本。
  • 我不是在写代码,更像是为了说明而写在纸上

标签: c multithreading concurrency locking mutual-exclusion


【解决方案1】:

你可以使用互斥锁来实现这个效果,

mutex.lock();
atomic
{
   int temp = a[i];
   a[i] =a[j];
   a[j] = temp;
}
mutex.unlock();

如果有多个线程,您可以使用 POSIX 样式的读/写锁,如下所示,

pthread_rwlock_rdlock(rw_lock_ptr);
atomic
{
   int temp = a[i];
   a[i] =a[j];
   a[j] = temp;
}
pthread_rwlock_unlock(rw_lock_ptr);

【讨论】:

    【解决方案2】:

    在我的理解中,您的意思是一些经典的显式锁定方法,例如互斥锁。

    这不仅需要交换代码,还需要访问a[] 的所有位置都受互斥体保护。否则,当您进行交换时,您无法确定其他线程不在从 a[] 读取的过程中。

    不确定 100% 的 atomic{}` 块的语义,以及它如何防止同样的问题(只是因为交换本身是原子发生的,它仍然可能与代码执行“混在一起”在不同的线程中并导致问题)。

    【讨论】:

      【解决方案3】:

      假设 a[i] 和 a[j] 可以被其他线程访问,则在您的代码访问这些元素时获取互斥锁。

      【讨论】:

        猜你喜欢
        • 2012-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-02
        • 1970-01-01
        • 2023-04-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多