Boost: что именно не является потокобезопасным в Boost.Signals? - PullRequest
9 голосов
/ 01 декабря 2009

Я читал в нескольких местах, что Boost.Signals не является потокобезопасным, но я не нашел больше подробностей об этом. Эта простая цитата не так уж и много говорит. Большинство приложений в настоящее время имеют потоки - даже если они пытаются быть однопоточными, некоторые из их библиотек могут использовать потоки (например, libsdl).

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

Но что именно работает, а что не будет работать? Будет ли работать, чтобы использовать его из нескольких потоков, если я не получаю к нему доступ одновременно? То есть если я построю свои собственные мьютексы вокруг слота?

Или я вынужден использовать слот только в том потоке, где я его создал? Или где я его впервые использовал?

Ответы [ 2 ]

5 голосов
/ 08 января 2010

Не думаю, что это слишком ясно, и один из рецензентов библиотеки сказал здесь :

Мне также не понравился тот факт, что только три раза было названо слово «нить». Boost.signals2 хочет быть библиотекой «потокобезопасных сигналов». Поэтому еще немного подробности и особенно больше примеров, касающихся этой области, следует пользователь.

Один из способов выяснить это - перейти к источнику и посмотреть, что они используют _mutex / lock () для защиты. Тогда просто представьте, что произойдет, если бы этих звонков не было. :)

Исходя из того, что я могу собрать, это обеспечивает простые вещи, такие как "если один поток выполняет подключение или отключение, это не приведет к сбою другого потока, который итерирует через слоты, прикрепленные к этим сигналам". Вроде того, как использование поточно-ориентированной версии библиотеки времени выполнения C гарантирует, что если два потока одновременно совершат правильные вызовы printf, то сбоя не будет. (Нельзя сказать, что полученный вами вывод будет иметь какой-то смысл & mdash; вы по-прежнему отвечаете за семантику более высокого порядка.)

Это не похоже на Qt, в котором поток, на котором запускается код определенного слота, основан на «привязке потока» целевого слота (что означает, что испускание сигнала может вызвать запуск слотов во многих различных потоках). параллельно.) Но я думаю, что не поддерживает, поэтому "комбинаторы" boost :: signal могут делать такие вещи .

0 голосов
/ 20 октября 2011

Одна проблема, которую я вижу, заключается в том, что один поток может подключаться или отключаться, пока другой поток сигнализирует.

Вы можете легко обернуть свой сигнал и соединить вызовы с мьютексами. Тем не менее, нетривиально обернуть соединения. (connect возвращает соединения, которые вы можете использовать для отключения).

...