Алгоритмы без использования блокировок: обнови, если сможешь, а я выключаюсь

Клиент попросил помощи в решении проблемы синхронизации процессов: У нас есть небольшой объем данных, который разделяется между несколькими процессами. Одним из способов защиты данных является использование примитива взаимоисключающей блокировки SpinLock. Однако этот подход может привести к взаимоблокировке, если процесс, владеющий примитивом SpinLock, не имеет возможности освободить его. Например, он может быть приостановлен отладчиком или кто-то…

0

Алгоритмы без использования блокировок: обнови, если сможешь, а я выключаюсь

Клиент попросил помощи в решении проблемы синхронизации процессов: У нас есть небольшой объем данных, который разделяется между несколькими процессами. Одним из способов защиты данных является использование примитива взаимоисключающей блокировки SpinLock. Однако этот подход может привести к взаимоблокировке, если процесс, владеющий примитивом SpinLock, не имеет возможности освободить его. Например, он может быть приостановлен отладчиком или кто-то…

0

Шаблоны использования функций InitOnce

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

0

Алгоритмы без использования блокировок: однократная инициализация

Частным случаем singleton-конструктора является обычная «ленивая» инициализация множества переменных. В однопоточном приложении вы можете написать примерно такой код: // предположим, что все допустимые значения переменных a и b удовлетворяют условиям: // a ≥ 0 и b ≥ a. Таким образом, -1 не является допустимым значением // и мы будем использовать его для того, чтобы обозначить,…

0

Алгоритмы без использования блокировок: выбор уникального значения (решения)

В прошлый раз я опубликовал задание для разминки, содержащее фрагмент кода для выбора уникального в пределах процесса значения. Я приведу его еще раз: dwUniqueId = InterlockedCompareExchange(&g_dwUniqueId,                                         g_dwUniqueId+1,                                         g_dwUniqueId); Скорее всего, проще будет перечислить то, что в этой функции корректно, нежели перечислять то, что она делает неправильно. Эм… все слова написаны без ошибок. Это все. Дэмиен…

0

Алгоритмы без использования блокировок: однократная инициализация

Частным случаем singleton-конструктора является обычная «ленивая» инициализация множества переменных. В однопоточном приложении вы можете написать примерно такой код: // предположим, что все допустимые значения переменных a и b удовлетворяют условиям: // a ≥ 0 и b ≥ a. Таким образом, -1 не является допустимым значением // и мы будем использовать его для того, чтобы обозначить,…

0

Алгоритмы без использования блокировок: выбор уникального значения (решения)

В прошлый раз я опубликовал задание для разминки, содержащее фрагмент кода для выбора уникального в пределах процесса значения. Я приведу его еще раз: dwUniqueId = InterlockedCompareExchange(&g_dwUniqueId,                                         g_dwUniqueId+1,                                         g_dwUniqueId); Скорее всего, проще будет перечислить то, что в этой функции корректно, нежели перечислять то, что она делает неправильно. Эм… все слова написаны без ошибок. Это все. Дэмиен…

0

Алгоритмы без использования блокировок: singleton-конструктор

Содержимое первой половины статьи будет, скорее всего, знакомым для многих (или почти всех?) читателей, но в конце статьи есть интересное упражнение. Весьма практичным шаблоном для Interlocked-* функций является ленивая инициализация без блокировок, которая использует InterlockedCompareExchangePointerRelease. Да, наименование у этой функции очень длинное, но, в действительности, каждая часть этого наименования важна. Widget *g_pwidCached; Widget *GetSingletonWidget() {…

0

Алгоритмы без использования блокировок: выбор уникального значения (разминка)

Вот небольшой фрагмент кода, который предназначен для генерации уникального числа в процессе. А вот статья для поднятия настроения. Предупреждение: она может оказаться полезной, а может и не оказаться. dwUniqueId = InterlockedCompareExchange(&g_dwUniqueId,                                         g_dwUniqueId+1,                                         g_dwUniqueId); Покритикуйте этот фрагмент кода.

0

Самая смешная шутка, которую я когда-либо рассказывал (по мнению трехлетних малышей)

Я протестировал эту шутку на нескольких детях в возрасте трех и четырех лет, и каждый раз она срабатывала. Два котенка шли по улице, и один из них шлепнулся на попу! Я разработал эту шутку для одной из моих любимых племянниц. Она только начала учиться рассказывать шутки и попросила меня рассказать ей какую-нибудь шутку. Один из…

0