我有用于交换元素的代码:
atomic{
int temp = a[i];
a[i] =a[j];
a[j] = temp;
}
如何使用细粒度锁定实现此目的以实现相同的效果?
答案 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],只要代码访问这些元素,就可以获取互斥锁。