Вызывает ли одновременное чтение накладные расходы?

#c# #multithreading

Вопрос:

Предположим, что в многопоточном программировании на C# у нас есть глобальный общий объект класса O . Несколько потоков могут одновременно считывать различные поля только для чтения O (т. Е. без записи, только для чтения). Приводит ли это к дополнительным накладным расходам или ожидается, что производительность чтения будет такой же быстрой, как и при однопоточном чтении?

Комментарии:

1. Технически это возможно , вам должно было бы очень не повезти в данном сценарии. Обязательно измеряйте.

2. @HansPassant для моих накладных расходов на обмен знаниями происходит только при записи, а не при чтении, иначе я бы это отметил. Вы знаете о каких-либо архитектурах, в которых это происходит?

3. Вы упускаете из виду статические переменные другого типа, которые находятся рядом в памяти, все еще в той же строке кэша, и в которые они записываются. У вас нет прямого контроля над адресом хранилища, поэтому нет особого смысла беспокоиться об этом. Рассматривайте заполнение только в том случае, если вы хотите знать, что у вас проблема.

4. Но даже с другими вещами в строке кэша конкретное чтение все равно не повлечет за собой накладных расходов. Только написание повлекло бы за собой ложные проблемы с общим доступом.

Ответ №1:

Простое чтение не будет иметь никаких накладных расходов.

Чтение, при котором вам необходимо обеспечить упорядочение памяти, может. volatile Поле или использование Volatile.Read может иметь накладные расходы как с точки зрения конкретной отдельной операции, так и из-за предотвращения некоторых оптимизаций окружающего кода, поскольку оно имеет другую семантику.