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