1

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

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

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

4

3 回答 3

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);
于 2013-05-27T13:14:04.790 回答
0

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

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

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

于 2013-05-27T13:13:19.480 回答
0

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

于 2013-05-27T13:14:27.267 回答