Если кратко, то при наличии структуры объектов, лочить ее mutex'ом всю при операциях над объектами несколькими потоками — слишком накладно и может увеличить простои одного из процессов в бесконечность.
В этом смысле аналогией может быть работа общественной уборной.
Если при каждом заходе в уборную на 10 кабинок будет лочится вся уборная — вырастет огромная очередь.
А уборная должна периодически чиститься. И уборщица не знает заняты ли места в уборной или нет.
Заходящий в уборную должен оповестить других о занятости кабинки. Потому заходя в кабинку сигнализирует об этом (atomic counter). Не исключено, что он может туда зайти и не один, но выйти все равно должны когда-то все из кабинки и разлочить ее. Периодически в уборную заглядывает уборщица. И когда она видит, что все двери разлочены — оставляет знак перед входом об уборке (mutex) и чистит уборную.
жаль что сугубо заточен под задачу где есть поток удалятор, и 1-N поток юзателей
да, можно еще сказать, что наличие объекта определяется единичным счетчиком, а остальные операции — счетчиком большим 1.
Можно еще обобщенно представить это в таком подобии псевдокода (разумеется, в оригинале объект сразу инициализируется в 1, как частный случай реализации):
Может, это натолкнет на мысли об альтернативном использовании. А какая именно схема интересна?
И я не очень понял и как получить (использовать) объект?
Похоже, автор статьи больше «затачивался» в ней на чистом Си, потому и не стал писать примеры C++.
Использование зависит от реализации. В этом смысле, думаю, мысль в правильном направлении — можно сделать шаблон аналогичный смарт поинтерам или даже наследоваться от какого-нибудь из них с перегрузкой для инкремента/декремента атомарного счетчика. Т.е. получается, что итератор будет модифицированным смарт поинтером. Но тут проблема — получается, что локинг будет при каждом обращении к поинтеру, потому iterator->lock()/unlock() вполне вариант. Можно еще как вариант сделать класс сессионности, лочащего и разлочивающего объект в своей зоне видимости.
Но в этом случае нельзя полагаться на то, что объект используется минуту.
На это точно не стоит полагаться. Какой-то из потоков может вовсе зависнуть.
Но в данном случае минута — относится больше к специфике задачи.
В остальном, можно рассмотреть, как вариант, сериализацию доступа к объекту (пул потоков).
Насчет примеров — самые яркие из них это работа с данными в БД. Положим, в некоторой непродуманной архитектуре есть процесс 1, который периодически чистит таблицу, например вчерашние данные («DELETE FROM mytable WHERE mydate<SYSDATE-1»), а другой процесс 2, оперируя закешированными данными или непосредственно делая предварительную выборку данных захочет поменять какую-то строку, предполагаемую для удаления процессом 1. процесс 2 считывает данные, процесс 1 удаляет данные, процесс 2 пытается изменить удаленную строку. Упс. Это еще не худший вариант, ибо есть deadlock'и
Лочить весь список — не вариант в многопоточном приложении. Как и было сказано «Если все, что делает поток манипулятора — это поиск записей и их обработка, то поток стирателя просто не сможет получить доступ к структуре данных». Т.е. манипулятор в этом случае будет лочить список постоянно и без остановок.
Зачем надо ждать? Если число ссылок больше, чем один, значит кто-то захватил объект. Вот когда он освободит, будет проверено, есть ли еще ссылки не объект. Если нет, то объект удаляется.
Именно об этом и говорится в тексте. Если число ссылок больше чем один, значит объект еще пользуется каким-то процессом, мы его удалить не можем и потоку придется ждать его освобождения.
Можно еще, чтобы не ждать, реализовать callback на нулевое число ссылок, хотя в этом случае никто не гарантирует отсутствие дополнительных проблем.
У того же Карлоса Кастанеды в 9м томе «Искусство сновидения» осознание себя во сне лишь первый этап. Ну и разумеется, техники Михаила Радуги по выходу из тела (хотя личный опыт у меня был раньше его публикаций, но набор его подходов вполне действенен).
Вот только все это уже ближе к эзотерике и все еще весьма далеко от современной науки, несмотря на то, что число переживших эти опыты гораздо больше, чем свидетелей квантовой запутанности.
боюсь, что список литературы гораздо шире С.Лабержа :) если не брать специализированную литературу, ближе всего к науке из них — работы Скупченко В.В. о фазотонном мозге («Фазотонный мозг» и «Фазотонный гомеостаз и врачевание»). Из последнего, пожалуй ближе книга «Голографическая вселенная» Майкла Таблота, хотя в ней есть масса «шероховатостей».
В лучших традициях практичного научного подхода — есть личный опыт как осознанных сновидений, так и выхода из тела. Последнее, к сожалению, толком не успел еще протестить по полной )
спасибо за видение положительных перспектив! это уже немало.
и согласен, в сети околоподобного «добра» порядочно.
насчет научных основ — есть два диплома с использованием нейросетей, пара аспирантских публикаций в сборниках и участие в конференциях. но я не отношу все это к практической пользе, а скорее к бумажной бюрократии с математическим «оправданием» системы, для которой сама математика является лишь продуктом и частным случаем (так сложилось, что моя первая квалификация — математик).
а для проверки собственных идей тестирую и дописываю свою небольшую библиотеку нейросимулятора на плюсах, которую после «вылизывания» выложу в opensource.
Если кратко, то при наличии структуры объектов, лочить ее mutex'ом всю при операциях над объектами несколькими потоками — слишком накладно и может увеличить простои одного из процессов в бесконечность.
В этом смысле аналогией может быть работа общественной уборной.
Если при каждом заходе в уборную на 10 кабинок будет лочится вся уборная — вырастет огромная очередь.
А уборная должна периодически чиститься. И уборщица не знает заняты ли места в уборной или нет.
Заходящий в уборную должен оповестить других о занятости кабинки. Потому заходя в кабинку сигнализирует об этом (atomic counter). Не исключено, что он может туда зайти и не один, но выйти все равно должны когда-то все из кабинки и разлочить ее. Периодически в уборную заглядывает уборщица. И когда она видит, что все двери разлочены — оставляет знак перед входом об уборке (mutex) и чистит уборную.
да, можно еще сказать, что наличие объекта определяется единичным счетчиком, а остальные операции — счетчиком большим 1.
Можно еще обобщенно представить это в таком подобии псевдокода (разумеется, в оригинале объект сразу инициализируется в 1, как частный случай реализации):
Может, это натолкнет на мысли об альтернативном использовании. А какая именно схема интересна?
Похоже, автор статьи больше «затачивался» в ней на чистом Си, потому и не стал писать примеры C++.
Использование зависит от реализации. В этом смысле, думаю, мысль в правильном направлении — можно сделать шаблон аналогичный смарт поинтерам или даже наследоваться от какого-нибудь из них с перегрузкой для инкремента/декремента атомарного счетчика. Т.е. получается, что итератор будет модифицированным смарт поинтером. Но тут проблема — получается, что локинг будет при каждом обращении к поинтеру, потому iterator->lock()/unlock() вполне вариант. Можно еще как вариант сделать класс сессионности, лочащего и разлочивающего объект в своей зоне видимости.
На это точно не стоит полагаться. Какой-то из потоков может вовсе зависнуть.
Но в данном случае минута — относится больше к специфике задачи.
В остальном, можно рассмотреть, как вариант, сериализацию доступа к объекту (пул потоков).
Лочить весь список — не вариант в многопоточном приложении. Как и было сказано «Если все, что делает поток манипулятора — это поиск записей и их обработка, то поток стирателя просто не сможет получить доступ к структуре данных». Т.е. манипулятор в этом случае будет лочить список постоянно и без остановок.
Именно об этом и говорится в тексте. Если число ссылок больше чем один, значит объект еще пользуется каким-то процессом, мы его удалить не можем и потоку придется ждать его освобождения.
Можно еще, чтобы не ждать, реализовать callback на нулевое число ссылок, хотя в этом случае никто не гарантирует отсутствие дополнительных проблем.
Вот только все это уже ближе к эзотерике и все еще весьма далеко от современной науки, несмотря на то, что число переживших эти опыты гораздо больше, чем свидетелей квантовой запутанности.
В лучших традициях практичного научного подхода — есть личный опыт как осознанных сновидений, так и выхода из тела. Последнее, к сожалению, толком не успел еще протестить по полной )
и согласен, в сети околоподобного «добра» порядочно.
насчет научных основ — есть два диплома с использованием нейросетей, пара аспирантских публикаций в сборниках и участие в конференциях. но я не отношу все это к практической пользе, а скорее к бумажной бюрократии с математическим «оправданием» системы, для которой сама математика является лишь продуктом и частным случаем (так сложилось, что моя первая квалификация — математик).
а для проверки собственных идей тестирую и дописываю свою небольшую библиотеку нейросимулятора на плюсах, которую после «вылизывания» выложу в opensource.