LINUX.ORG.RU

История изменений

Исправление firkax, (текущая версия) :

Нет, мютекс это штука от ядра операционной системы. С++ный атомик из его библиотеки - надстройка над нативным компиляторным атомиком, а тот, в свою очередь - ассемблерный. Атомики есть не только в С++, в Си они тоже есть ничуть не хуже (основа везде одна и та же).

Есть такая инструкция CMPXCHG. Она сравнивает заданную величину с содержимым переменной, и, если они совпадают, записывает в переменную другую заданную величину, а если нет - возвращает то самое отличающееся содержимое переменной. Поскольку это одна ассемблерная инструкция, переключатель процессов ОС не может вклиниться в середине и разрушить её атомарность. Ещё в ассемблере есть префикс LOCK - он указывает процу на время выполнения инструкции сообщить остальным процам (ядрам), что им нельзя трогать память. Таким образом «LOCK CMPXCHG» атомарно и в многоядерных системах. Блокировка тут зашита в сам проц, никак не зависит от операционной системы и делается ровно на время выполнения инструкции, что очень эффективно.

Как с её помощью сделать атомарный инкремент, декремент и другие изменения переменной, думаю не надо объяснять.

Ядро, когда делает мютексы и прочие синхронизации, тоже использует эту штуку чтобы синхронизироваться между своими собственными тредами. Теоретически ты можешь с помощью атомика сделать свой собственный мютекс, rwlock или любой другой примитив синхронизации, с любыми нужными характеристиками, за одним исключением: если оказывается что блокировка занята другим тредом, тебе желательно уйти в сон, а это уже без сисколлов сделать не получится.

Есть синхронизация без сна - спинлок. Это аналог мютекса, но если спинлок занят, ожидающий тред проверяет его в бесконечном цикле снова и снова, тратя на это процессорное время, но зато об освобождении спинлока он узнает максимально быстро. Используется такое если под блокировкой делаются только очень простые и короткие действия, которые выгоднее подождать именно так, а не через сон.

Исходная версия firkax, :

Нет, мютекс это штука от ядра операционной системы. С++ный атомик из его библиотеки - надстройка над нативным компиляторным атомиком, а тот, в свою очередь - ассемблерный. Атомики есть не только в С++, в Си они тоже есть ничуть не хуже (основа везде одна и та же).

Есть такая инструкция CMPXCHG. Она сравнивает заданную величину с содержимым переменной, и, если они совпадают, записывает в переменную другую заданную величину, а если нет - возвращает то самое отличающееся содержимое переменной. Поскольку это одна ассемблерная инструкция, переключатель процессов ОС не может вклиниться в середине и разрушить её атомарность. Ещё в ассемблере есть префикс LOCK - он указывает процу на время выполнения инструкции сообщить остальным процам (ядрам), что им нельзя трогать память. Таким образом «LOCK CMPXCHG» атомарно и в многоядерных системах. Блокировка тут зашита в сам проц, никак не зависит от операционной системы и делается ровно на время выполнения инструкции, что очень эффективно.

Как с её помощью сделать атомарный инкремент, декремент и другие изменения переменной, думаю не надо объяснять.

Ядро, когда делает мютексы и прочие синхронизации, тоже использует эту штуку чтобы синхронизироваться между своими собственными тредами. Теоретически ты можешь с помощью атомика сделать свой собственный мютекс, rwlock или любой другой примитив синхронизации, с любыми нужными характеристиками, за одним исключением: если оказывается что блокировка занята другим тредом, тебе желательно уйти в сон, а это уже без сисколлов сделать не получится.

Есть синхронизация без сна - спинлок. Если спинлок занят, ожидающий тред проверяет его в бесконечном цикле снова и снова, тратя на это процессорное время, но зато об освобождении спинлока он узнает максимально быстро. Используется такое если под блокировкой делаются только очень простые и короткие действия, которые выгоднее подождать именно так, а не через сон.