#c# #multithreading
Вопрос:
Предположим, что в многопоточном программировании на C# у нас есть глобальный общий объект класса O
. Несколько потоков могут одновременно считывать различные поля только для чтения O
(т. Е. без записи, только для чтения). Приводит ли это к дополнительным накладным расходам или ожидается, что производительность чтения будет такой же быстрой, как и при однопоточном чтении?
Комментарии:
1. Технически это возможно , вам должно было бы очень не повезти в данном сценарии. Обязательно измеряйте.
2. @HansPassant для моих накладных расходов на обмен знаниями происходит только при записи, а не при чтении, иначе я бы это отметил. Вы знаете о каких-либо архитектурах, в которых это происходит?
3. Вы упускаете из виду статические переменные другого типа, которые находятся рядом в памяти, все еще в той же строке кэша, и в которые они записываются. У вас нет прямого контроля над адресом хранилища, поэтому нет особого смысла беспокоиться об этом. Рассматривайте заполнение только в том случае, если вы хотите знать, что у вас проблема.
4. Но даже с другими вещами в строке кэша конкретное чтение все равно не повлечет за собой накладных расходов. Только написание повлекло бы за собой ложные проблемы с общим доступом.
Ответ №1:
Простое чтение не будет иметь никаких накладных расходов.
Чтение, при котором вам необходимо обеспечить упорядочение памяти, может. volatile
Поле или использование Volatile.Read
может иметь накладные расходы как с точки зрения конкретной отдельной операции, так и из-за предотвращения некоторых оптимизаций окружающего кода, поскольку оно имеет другую семантику.