C中的细粒度锁定

时间:2013-05-27 13:04:58

标签: c multithreading concurrency locking mutual-exclusion

我有用于交换元素的代码:

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

如何使用细粒度锁定实现此目的以实现相同的效果?

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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

这不仅需要交换代码,还需要访问a[]的所有地方,以便互斥锁保护。否则,当你进行交换时,你无法确定某个其他线程是否正在从a[]读取。

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

答案 2 :(得分:0)

假设其他线程可以访问[i]和[j],只要代码访问这些元素,就可以获取互斥锁。