Да, неустойчивый - это абсолютный минимум, Мне нужно. Это гарантирует, что генератор кода не будет генерировать код, который сохраняет переменную в регистре и всегда выполняет чтение и запись из/в память. Большинство генераторов кода могут обеспечить гарантии атомарности для переменных, которые имеют тот же размер, что и родное слово ЦП, они обеспечат выравнивание адреса памяти, чтобы переменная не могла оседлать границу линии кэша.
Это, однако, не очень сильный контракт на современные многоядерные процессоры. Volatile not обещает, что другой поток, который работает на другом ядре, может видеть обновления переменной. Для этого требуется барьер памяти, обычно это инструкция, которая очищает кеш процессора. Если вы не обеспечите барьер, поток фактически продолжит работать, пока такой флеш не произойдет естественным образом. Это в конечном итоге произойдет, планировщик потоков обязательно предоставит один. Это может занять миллисекунды.
После того, как вы позаботились о таких деталях, вы в конце концов повторно изобрели переменную условия (событие aka), которая вряд ли будет быстрее, чем та, которая предоставляется библиотекой потоков. Или же проверено. Не придумывайте свои собственные, резьба достаточно сложна, чтобы получить право, вам не нужно FUD, чтобы не быть уверенным в том, что основные примитивы прочны.
Что заставляет вас думать, что записи будут атомарными? – bmargulies
Я не эксперт по многопоточности, но я всегда буду реализовывать блокировку любого общего ресурса ... –
Я делал такие вещи на встроенном одноядерном процессоре PowerPC и работает надежно. Лучше не делать read-modify-write (например, '++ sharedInt'), если возможно, что два потока имеют доступ на запись. (На самом деле, если два потока могут писать, это, вероятно, полезно только в том случае, если вы ограничиваете **, когда ** они могут писать. Например, потоку A разрешено изменять 'sharedInt' от 0 до 1, тогда как потоку B разрешено изменять его с 1 до 0.) – Dan