Как иметь несколько волокон в C — как вектор волокон

#c #c 11 #boost

#c #c 11 #повышение

Вопрос:

Я хочу, чтобы несколько волокон работали следующим образом.

 #include <boost/fiber/fiber.hpp>    

#include <vector>

void printNum(int i) {
   std::cout << i << std::endl;
}

void handleInts (std::vector<std::unique_ptr<int>>amp; ints) {
  std::vector<boost::fibers::fiber> runningFibers;
  for (autoamp; integer : ints) {
     runningFibers.emplace_back(boost::fibers::fiber([amp;](){ printNum(*integer);));
  }
}

int main() {
   
  std::vector<std::unique_ptr<int>> ints;
  
  auto firstInt = std::make_unique<int>(1);
  auto secondInt = std::make_unique<int>(2);

  ints.emplace_back(std::move(firstInt));
  ints.emplace_back(std::move(secondInt));

  handleInts(ints);
  
  return 0;
}
  

Однако это вызывает некоторую утечку памяти при запуске с valgrind. Как мне сделать то, что я пытаюсь сделать здесь, но без утечек памяти. Я просмотрел документацию boost, но запутался.

Комментарии:

1. Утечки памяти — это свойства полных программ, а не фрагментов. Можете ли вы опубликовать полную программу? В идеале не вводите код, main поскольку в main есть причудливые статические правила жизненного цикла, которые, я не думаю, являются основой вашей проблемы.

2. Хорошо, я отредактировал его, чтобы дать больше контекста. На самом деле я не использую целые числа, я использую буферы протокола, но это не так важно для моего вопроса. Я мог бы смоделировать его, если это необходимо.

3. Пока ваш пример демонстрирует утечку, это ключевая часть, чтобы другие могли взять ваш код и подтвердить его, не придумывая код, который может или не может решить вашу проблему. 🙂

4. В контексте Boost (зависимость) задокументирована проблема с valgrind, которая требует перестроения библиотеки с помощью опции с именем «valgrind= on»: boost.org/doc/libs/1_74_0/libs/context/doc/html/context/stack/… . Это возможный источник ваших ошибок?

5. О, да, это действительно может быть. Я попытаюсь выяснить, смогу ли я это сделать.