Мелкозернистая блокировка в C

У меня есть этот код для замены элементов:

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

Как бы я реализовал это, используя мелкозернистую блокировку, чтобы добиться того же эффекта?


person user2035796    schedule 27.05.2013    source источник
comment
Что это за язык?   -  person unwind    schedule 27.05.2013
comment
Какую библиотеку вы используете для распараллеливания?   -  person Martin Perry    schedule 27.05.2013
comment
Я думаю, что это просто обобщенная версия атомарной операции. Я видел его в экзаменационной работе, и они попросили его более детальную версию блокировки.   -  person user2035796    schedule 27.05.2013
comment
Я не кодирую это, больше похоже на то, что я пишу это на бумаге для иллюстраций.   -  person user2035796    schedule 27.05.2013


Ответы (3)


Вы можете использовать мьютекс для достижения этого эффекта,

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);
person Deepu    schedule 27.05.2013

В моем понимании, вы имеете в виду какой-то классический явный подход к блокировке, такой как мьютексы.

Для этого потребуется не только код подкачки, но и все места, где осуществляется доступ к a[], должны быть защищены мьютексом. В противном случае вы не можете быть уверены, что какой-то другой поток не находится в процессе чтения из a[], когда вы выполняете обмен.

Не уверен на 100% в семантике вашего блока atomic{}` и в том, как это будет работать для защиты от той же проблемы (просто потому, что сам обмен происходит атомарно, он все еще может плохо «смешиваться» с кодом, выполняющимся в другом потоке и привести к проблемам).

person unwind    schedule 27.05.2013

Предполагая, что a[i] и a[j] могут быть доступны другим потокам, приобретайте мьютекс всякий раз, когда ваш код обращается к этим элементам.

person Claudio    schedule 27.05.2013