Из вашего описания кажется, что вы пишете в ThreadParameter (или какую-либо другую структуру данных) ДО запуска любых дочерних потоков, и вы никогда больше не будете писать в ThreadParameter ... он существует для чтения по мере необходимости, но никогда не изменяетсяснова после его инициализации;это верно?Если это так, то нет необходимости использовать какие-либо системные вызовы синхронизации потоков (или примитивы процессора / компилятора) каждый раз, когда дочерний поток хочет прочитать данные, или даже впервые в этом отношении.
Обработкаот volatile зависит от конкретного компилятора;Я знаю, что, по крайней мере, в Diab для PowerPC есть опция компилятора в отношении обработки энергозависимых: либо используйте инструкцию PowerPC EIEIO (или MBAR) после каждого чтения / записи в переменную, либо не используйте ее ... этов дополнение к запрещению оптимизации компилятора, связанной с переменной.(EIEIO / MBAR - это инструкция PowerPC о запрете переупорядочения ввода-вывода самим процессором; т. Е. Все операции ввода-вывода до выполнения инструкции должны быть выполнены до ввода-вывода после инструкции).
Из правильности/ точка зрения безопасности, это не помешает объявить его как изменчивый.Но с прагматической точки зрения, если вы инициализируете ThreadParameter достаточно далеко перед StartThread (), объявлять его энергозависимым на самом деле не нужно (и это не ускорит все последующие обращения к нему).Практически любой существенный вызов функции (скажем, к printf () или cout, или любому системному вызову и т. Д.) Будет выдавать на порядки больше инструкций, чем необходимо, чтобы гарантировать, что процессор никак не обработал бы запись вThreadParameter перед вашим вызовом StartThread ().Реально сам StartThread () почти наверняка выполнит достаточно инструкций до того, как рассматриваемый поток действительно запустится.Поэтому я полагаю, что вам не нужно объявлять его как volatile, вероятно, даже если вы инициализируете его непосредственно перед вызовом StartThread ().
Теперь о вашем вопросе относительно того, что произойдет, если страница, содержащаяэта переменная уже была загружена в кэш обоих процессоров до того, как процессор, выполняющий основной поток, выполнит инициализацию: если вы используете общедоступную платформу общего назначения с процессорами подобного типа, то для обработки кэша должно быть уже установлено оборудованиесогласованность для вас.Когда вы сталкиваетесь с проблемой когерентности кэша на платформах общего назначения, независимо от того, являются они мультипроцессорными или нет, это когда ваш процессор имеет отдельный кэш инструкций и данных и вы пишете самоизменяющийся код: инструкции, записанные в память, неотличимы от данных,поэтому ЦПУ не делает недействительными эти местоположения в кеше команд, поэтому в кеше команд могут быть устаревшие инструкции, если впоследствии вы не сделаете недействительными эти места в кеше команд (либо введете свои собственные инструкции по сборке для конкретного процессора, чего вы не можетеразрешено делать в зависимости от вашей ОС и уровня привилегий вашего потока, или же выполнить соответствующий системный вызов, запрещающий кэширование вашей ОС).Но то, что вы описываете, не является самоизменяющимся кодом, поэтому вы должны быть в безопасности в этом отношении.
Ваш вопрос 1 спрашивает, как сделать это безопасным для ВСЕХ процессорных архитектур.Что ж, как я уже говорил выше, вы должны быть в безопасности, если используете процессоры подобного типа, шины данных которых должным образом соединены.Процессоры общего назначения, предназначенные для межпроцессорного взаимодействия, имеют протоколы отслеживания шины для обнаружения операций записи в общую память ... при условии, что ваша библиотека потоков правильно настраивает область общей памяти.Если вы работаете во встроенной системе, вам, возможно, придется настроить это самостоятельно в своем BSP ... для PowerPC, вам нужно взглянуть на биты WIMG в конфигурации MMU / BAT;Я не знаком с другими архитектурами, чтобы дать вам указатели на них.НО .... Если ваша система является доморощенной или если ваши процессоры не похожи друг на друга, вы не сможете рассчитывать на то, что два процессора смогут отслеживать записи друг друга;проконсультируйтесь с вашими аппаратными специалистами.