static char const err_msg[] = "Hell has frozen over.";
Некоторое время я думал, что было бы хорошо разделить const
переменные, подобные той, что была выше, между потоками, но потом мне пришло в голову, что, если такие переменные не начинаются и не заканчиваются точно на границе кеш-линии, любые соседние не-константные данные могут вызвать ложное совместное использование , что приведет к любому из штрафов за производительность, которые могут повлечь за собой.
То, будет ли это беспокойство допустимым, - я предполагаю - зависит откак язык C и / или компиляторы определяют, где место выделено для static
(const
) переменных;но, тем не менее, чтобы минимизировать вероятность ложного обмена, я думаю, что лучше всего объявить все static
переменные как thread_local
в многопоточном контексте, даже если они const
:
thread_local static char const err_msg[] = "Hell has frozen over.";
МожетВы подтверждаете это?
@ MichaelDorgan упомянул, что есть платформы, где "есть дополнительная стоимость, связанная с доступом к локальной переменной потока, и ограничение на количество, которое может быть объявлено".Любые ссылки, подтверждающие, что могут повлиять на мои предположения выше.
@ JonathanLeffler упоминал, что переменные const
, как правило, размещаются в областях памяти только для чтения, что устраняет ложные проблемы совместного использования.Тогда последующим вопросом в этом отношении будет следующий: это строго зависит от платформы или существуют более сильные гарантии?