как поместить std:: string в boost:: lockfree:: queue (или альтернативу)?
Я пытаюсь поместить std::string s в boost::lockfree::queue s, чтобы мои потоки могли обновлять друг друга новыми данными.
Когда я пытаюсь использовать boost::lockfree::queue<std::string> updated_data;, g++ говорит:
В экземпляре ' class boost:: lockfree:: queue >':
Ошибка: статическая ошибка утверждения: (буст::has_trivial_destructor::значение)
Ошибка: статическая ошибка утверждения: (буст::has_trivial_assign::значение)
Мне было показано в целом, что означают эти ошибки , но у меня нет надежды когда-либо исправлял это сам, так как я почти новичок в c++.
Существует ли альтернативный способ передачи текстовых данных между потоками с помощью lockfree? Если нет, пожалуйста, покажите мне, как поместить std::string в boost::lockfree::queue.
3 ответов:
Если вы поместите необработанные указатели в очередь, старые
std::stringsбудут просочены, так как нет способа освободить их, когда они больше не нужны. Это происходит потому, что нет способа освободить объекты потокобезопасным способом, не взяв блокировку (кроме некоторых трюков, таких как указатели опасности, которыеboost::lockfree::queueне используют)По техническим причинам, которые я действительно не понимаю,
boost::lockfree::queueтребует тривиального оператора присваивания и тривиального деструктора, что означает, что ваш объект не может быть ни содержать, ни содержать любой тип данных, который должен освободить память в своем деструкторе, напримерstd::string.
Документация
boost::lockfree::queueчетко указывает, что содержащийся itemm должен иметь тривиальное назначение копии и деструктор, которого уstd::stringнет.Если у вас есть один производитель и один потребитель, вы можете использовать
spsc_queue(http://www.boost.org/doc/libs/1_54_0/doc/html/boost/lockfree/spsc_queue.html ), которая требует только конструктив-ности и копируемости по умолчанию.Если у вас есть несколько производителей или потребителей, вы застрянете с обычной блокировочной очередью (или пользовательская строка, которая не использует динамическое выделение).
Тогда я должен задаться вопросом, почему вы возитесь с такими вещами, как очереди lockfree.У меня нет никакой надежды когда-либо исправить это самостоятельно, так как я почти новичок в c++.
Да, вы можете просто хранить указательСуществует ли альтернативный способ передачи текстовых данных между потоками с помощью
lockfree?std::string*на данные в очереди, потому что указатель является тривиальным типом и поэтому разрешен в очереди. Эквивалентно, вы можете хранитьreference_wrapper<std::string>. Проблема в том, что это вы нужно хранить строки где-то еще, чтобы иметь возможность указывать на них, поэтому теперь все, что вы сделали, это переместили проблему в другое место (например, вы могли бы поддерживать список строк в каждом потоке и хранить указатели на внешне управляемую строку в свободной от блокировки очереди, но вы не знаете, когда безопасно удалитьstringиз списка каждого потока, чтобы он рос и рос.)Я бы предложил вам использовать простой
std::queue<std::string>и сделать свою собственную синхронизацию сboost::mutexиboost::condition_variable, или найти существующая реализация потокобезопасной (не без блокировки!) очередь.
Comments