@Mercury13
Программист на «си с крестами» и не только

Несинхронизированный доступ к памяти и многопоточная гонка?

Здравствуйте. Программа (точнее, хорошо отлаженная её часть) недавно продемонстрировала гонку. Намеренно повторить не удалось — вероятно, глюк очень редкий. В связи с этим вопрос.


Сложное вычисление разбивается между несколькими процессорами. Для ускорения работы используется несинхронизированный кэш (грубо говоря, массив double'ов) с такой логикой.

double &x = кэш[i];<br/>
if (isnan(x)) then кэш[i]=вычислить(i);<br/>
return x;<br/>



Возможны ли многопоточные гонки при параллельном чтении и записи double'а в одну и ту же ячейку? Как лучше ошибку обойти?
  • Вопрос задан
  • 2593 просмотра
Пригласить эксперта
Ответы на вопрос 3
VenomBlood
@VenomBlood
Касательно представленного куска:
Вопервых — надо понять, являются ли в вашем случае операции манипулирования double — атомарными с заблокированной шиной, для этого нужно знать архитектуру процессора, на котором все это пускается и видеть дизассембл представленного кода.
Во вторых надо убедиться в том, что сама функция вычислить(...) — является реентерабельной.
В третих — с чего вы вообще взяли что это гонка?

Исходя из представленного кода — можно только предложить обернуть его в double checked locking, но вообще то, что оно до сих пор не обернуто говорит или о том, что первые два пункта уже проделаны (что сомнительно, ибо в таком случае понятно, что в представленном коде нет гонки), или о том, что нифига этот код ни «хорошо отлаженный».
Ответ написан
Комментировать
TheHorse
@TheHorse
Могу посоветовать модернизацию:

double &x = кэш[i];
if (isnan(x)) then
{
кэш[i]=1; // чтоб зазря для одного i много потоков не делали вычислить(i);
кэш[i]=вычислить(i);
}
return x;

А по поводу гонок — в чем проявилась гонка? Присваивание и чтение вроде как атомарные операции…
Ответ написан
@lesha_penguin
Если данные невыровненны, то могут быть любые фокусы, атомарность не гарантируется.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы