Рентген 1:
Этот код, вероятно, не будет делать то, что вы думаете. Когда вы пишете такой код, вы вводите в свой код гонку данных. Это почти наверняка ошибка, которая приведет к недетерминированному сбою вашей программы.
Структуры данных (включая shared_ptr) обычно не предназначены для одновременного доступа. Не изменяйте одну и ту же структуру одновременно в более чем одном потоке. Это могло повредить структуру. Не изменяйте его в одном потоке и не читайте в другом потоке. Читатель мог видеть противоречивые данные. Вероятно несколько потоков могут читать его одновременно.
Если вы думаете, что действительно хотите сделать что-то из вышеперечисленного, узнайте, допускает ли структура данных некоторые из этих вариантов поведения, в разделе, вероятно, озаглавленном «Безопасность потоков». Если это позволяет им, еще раз посмотрите, действительно ли это нужно для вашей производительности, и затем используйте это. (Документация по shared_ptr НЕ разрешает то, что вы делаете.)
Рентген 2:
Теперь, что касается более высокого уровня, вам, вероятно, не следует выполнять синхронизацию потоков, ожидая, пока указатель не будет установлен в NULL. На самом деле, смотрите на условные переменные, барьеры или фьючерсы как на способ заставить один поток ждать, пока другой с чем-то не закончит. Это более приятный интерфейс, и кто бы ни посмотрел на ваш код в следующий раз (включая вас через 6 месяцев), он будет вам благодарен.
Я знаю, что вас беспокоит стоимость реальной синхронизации. Не беспокойся об этом. Все будет хорошо. Если вас беспокоит конкуренция за блокировку, используйте барьеры или фьючерсы, которые не требуют большой разделяемой блокировки.
Предупреждение: есть время для написания кода, который избегает блокировок любой ценой. Но если вы не смотрите данные профилировщика, которые говорят, что ваши операции синхронизации слишком медленные для вашей целевой рабочей нагрузки, сейчас не время.
Трек 3:
Надеюсь, что shared
в вашем примере глобален. В противном случае у вас есть несколько потоков с локальными ссылками на один и тот же shared_ptr
, который указывает на реальный объект, который вам интересен. Это своего рода поражение цели наличия указателя с подсчетом ссылок. Скажите, пожалуйста, это глобально.
person
Karmastan
schedule
11.01.2011
volatile
[1]: stackoverflow.com/questions/4168735/ [2]: software.intel.com / en-us / blogs / 2007/11/30 / [3]: stackoverflow.com/questions/4136900/ - person John Dibling   schedule 11.01.2011volatile
бесполезен), похоже, тоже отвечает на этот вопрос. - person sbi   schedule 12.01.2011volatile
- подавить оптимизацию. Кажется, это полная противоположность той причине, по которой вы, возможно, пытаетесь его использовать. - person John Dibling   schedule 12.01.2011