как поместить 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.

728   3  

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 ), которая требует только конструктив-ности и копируемости по умолчанию.

Если у вас есть несколько производителей или потребителей, вы застрянете с обычной блокировочной очередью (или пользовательская строка, которая не использует динамическое выделение).

У меня нет никакой надежды когда-либо исправить это самостоятельно, так как я почти новичок в c++.

Тогда я должен задаться вопросом, почему вы возитесь с такими вещами, как очереди lockfree.

Существует ли альтернативный способ передачи текстовых данных между потоками с помощью lockfree?

Да, вы можете просто хранить указатель std::string* на данные в очереди, потому что указатель является тривиальным типом и поэтому разрешен в очереди. Эквивалентно, вы можете хранить reference_wrapper<std::string>. Проблема в том, что это вы нужно хранить строки где-то еще, чтобы иметь возможность указывать на них, поэтому теперь все, что вы сделали, это переместили проблему в другое место (например, вы могли бы поддерживать список строк в каждом потоке и хранить указатели на внешне управляемую строку в свободной от блокировки очереди, но вы не знаете, когда безопасно удалить string из списка каждого потока, чтобы он рос и рос.)

Я бы предложил вам использовать простой std::queue<std::string> и сделать свою собственную синхронизацию с boost::mutex и boost::condition_variable, или найти существующая реализация потокобезопасной (не без блокировки!) очередь.

Comments

    Ничего не найдено.