我有这个用于交换元素的代码:
atomic{
int temp = a[i];
a[i] =a[j];
a[j] = temp;
}
我将如何使用细粒度锁定来实现这一点以达到相同的效果?
我有这个用于交换元素的代码:
atomic{
int temp = a[i];
a[i] =a[j];
a[j] = temp;
}
我将如何使用细粒度锁定来实现这一点以达到相同的效果?
你可以使用互斥锁来实现这个效果,
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);
在我的理解中,您的意思是一些经典的显式锁定方法,例如互斥锁。
这不仅需要交换代码,而且需要a[]
访问的所有位置都受到互斥锁的保护。a[]
否则,当您进行交换时,您无法确定其他线程不在从 读取的过程中。
不确定 100% 的atomic
{}` 块的语义,以及它如何防止同样的问题(只是因为交换本身是原子发生的,它仍然可能与在不同线程中执行的代码严重“混合”并导致到问题)。
假设 a[i] 和 a[j] 可以被其他线程访问,只要您的代码访问这些元素,就获取一个互斥锁。