У меня есть этот код для замены элементов:
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] могут быть доступны другим потокам, приобретайте мьютекс всякий раз, когда ваш код обращается к этим элементам.