Если у меня есть следующие psuedocode:Должен ли доступ к общему ресурсу блокироваться родительским потоком до появления дочернего потока, который обращается к нему?
sharedVariable = somevalue;
CreateThread(threadWhichUsesSharedVariable);
ли теоретически возможный многоядерный процессор для выполнения кода в threadWhichUsesSharedVariable(), который считывает значение sharedVariable перед родительским потоком записывает на него? Для полного теоретического избежания даже отдаленной возможности состояния гонки, если код выглядеть вместо этого:
sharedVariableMutex.lock();
sharedVariable = somevalue;
sharedVariableMutex.unlock();
CreateThread(threadWhichUsesSharedVariable);
В основном я хочу знать, если нерест поток явно линеаризует CPU в этой точке и гарантированно это сделает.
Я знаю, что накладные расходы на создание нитей, вероятно, занимает достаточно времени, что это никогда не имеет значения на практике, но перфекционист во мне боится теоретического состояния гонки. В экстремальных условиях, когда некоторые потоки или ядра могут сильно отставать, а другие работают быстро и эффективно, я могу себе представить, что может быть возможно удаленно, чтобы порядок выполнения (или доступ к памяти) был отменен, если не было блокировки.
Мой вопрос касается таких языков, как C++, где вы близки к уровню машины, и где «блокировка» достигается с помощью простого цикла InterlockedExchange. Я обеспокоен тем, что объявления переменных «volatile» недостаточно для обеспечения синхронизации. Разве нет разницы между «атомарным» и «синхронизированным»? Атомные операции не могут быть разделены - и если переменная объявлена volatile, компилятор не будет переупорядочивать обращения к ней - но не может ли их переупорядочить? Особенно при доступе к различным ядрам? – Deadcode
Дополнительные пояснения: В моем примере «sharedVariable = somevalue» используется для передачи данных в threadWhichUsesSharedVariable. Очень важно, чтобы threadWhichUsesSharedVariable только обращался к «sharedVariable» после того, как он был назначен родительским потоком. – Deadcode
ЦПУ может только изменять порядок доступа, если переупорядочение не отображается , поэтому переупорядочение ЦП не должно вызывать беспокойства. Значительная часть сложности в проектировании многоядерных систем заключается в обеспечении того, чтобы программы никогда не видели разницы в поведении от одноядерной системы. –