Интрузивные контейнеры имеют гарантии безопасности резьбы, аналогичные контейнерам STL.
- Несколько потоков, имеющих доступ к различным экземплярам, безопасны, если вставленные объекты различны.
- Доступ к одному и тому же контейнеру безопасен.
Некоторые назойливые крючки (например, автоматические крючки) изменяют контейнеры без ссылки на них: это считается письменным доступом к контейнеру.
Другие функции, такие как проверка, если объект уже вставлен в контейнер с использованием, связаны().
Составляющие безопасные крючки, представляют собой считываемый доступ к контейнеру без ссылки на него, поэтому ни одна другая нить не должна иметь письменный доступ (прямой или косвенный) к этому контейнеру.
Поскольку один и тот же предмет можно вставлять в несколько контейнеров одновременно с помощью разных крючков, безопасность резьбыBoost.Intrusiveотносится к контейнерам, а также к объекту, срок службы которого управляется пользователем вручную.
Как мы видим, анализ нитевой безопасности программы с использованиемBoost.Intrusiveсложнее, чем с неинтрузивными контейнерами.
Для анализа безопасности резьбы рассмотрите следующие моменты:
- Деструктор крючка автоотмыкания и
unlink()
функции изменяют контейнер косвенно.
- Функции безопасного режима и автоматических крючков
являются связанными()
являются считываемым доступом к контейнеру.
- Вставка объекта в контейнеры, которые будут модифицированы различными нитями, не гарантирует безопасность нити, хотя на большинстве платформ она будет безопасна без блокировки.