Должны ли статические переменные const в многопоточных приложениях объявляться thread_local, чтобы избежать ложного совместного использования? - PullRequest
3 голосов
/ 28 июня 2019
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, как правило, размещаются в областях памяти только для чтения, что устраняет ложные проблемы совместного использования.Тогда последующим вопросом в этом отношении будет следующий: это строго зависит от платформы или существуют более сильные гарантии?

...