Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Пул потоков на основе boost::lockfree::queue - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Не найдена зависимая сборка http://www.cyberforum.ru/cpp-beginners/thread1233154.html
Нашел статью, в которой говорится, что OpenMP от VS2005 работает лучше, нежели от VS2010. Собрал проект согласно инструкции; запустил, потестил и согласился с ней. Вот только одно но: собранный...
C++ Как сделать чтобы каждый раз рандомное число менялось? Вопрос таков: Как сделать чтобы каждый раз рандомное число менялось? И каким образом или на каком этапе "выбирается" это число, т.к сколько бы раз я не компилировал всегда выводится 42. ... http://www.cyberforum.ru/cpp-beginners/thread1233148.html
C++ Вывести одно целое число– количество возможных разбиений войска на отряды
Согласно многовековой традиции, сэр Петрейн каждую субботу ходит охотиться на дракона. Однако, за один вечер до выхода в очередной поход, он понял, что просто невозможно идти охотится на дракона без...
C++ Двойной цикл: нужно получить первое значение если выполнится условие
есть двойной цикл и нужно получить первое значение если выполнится это условие if (!field->IsWin()) получаем значения и останавливаем циклы как это сделать? for (int x = 0; x < columns; ++x) { ...
C++ Как правильно добавлять и удалять элементы в вектор и из него http://www.cyberforum.ru/cpp-beginners/thread1233116.html
Всем доброго времени суток. Прошу объяснить как правильно добавлять и удалять элементы в вектор и из него... Использую его для хранения объектов разных классов(понимаю что cut, но так удобнее). ...
C++ Создайте класс employee, который содержит имя (объект класса string) и номер (типа long) служащего Создайте класс employee, который содержит имя (объект класса string) и но- мер (типа long) служащего. Включите в него метод getdata(), предназна- ченный для получения данных от пользователя и... подробнее

Показать сообщение отдельно
DiffEreD
1431 / 768 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
24.07.2014, 13:22  [ТС]
Ясненько. Запихнуть невпихуемое не выйдет.
Я вот только что попробовал переписать с boost::lockfree::spsc_queue - все заработало. С описания из документации, я так понял, что эта очередь будет медленнее чем boost::lockfree::queue, но это не критично.
Вообщем, кто писал пулы потоков, нормальная такая реализация?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
class function_wrapper
{
   struct impl_base {
      virtual void call() = 0;
      virtual ~impl_base() {}
   };
 
   std::shared_ptr<impl_base> impl;
 
   template <typename F>
   struct impl_type : impl_base
   {
      F f;
      impl_type(F&& f_) : f(std::move(f_)) {}
      void call() override { f(); }
   };
 
public:
   template <typename F>
   function_wrapper(F&& f) : impl(new impl_type<F>(std::move(f)))
   {}
 
   function_wrapper() = default;
   function_wrapper(const function_wrapper&) = default;
   function_wrapper(function_wrapper&) = default;
   ~function_wrapper() = default;
 
   void operator ()() { impl->call(); }
};
 
class join_thread
{
   std::vector<std::thread>& threads;
public:
   explicit join_thread(std::vector<std::thread>& threads_) :
      threads(threads_)
   {}
   ~join_thread()
   {
      for (auto& thread : threads) {
         if (thread.joinable()) thread.join();
      }
   }
};
 
boost::lockfree::spsc_queue<function_wrapper> work_queue(128);
 
class thread_pool
{
   std::atomic<bool> done;
   std::vector<std::thread> threads;
   join_thread joiner;
 
   void worker_thread()
   {
      while (!done)
      {
         function_wrapper task;
         if (work_queue.pop(task))
            task();
         else
            std::this_thread::yield();
      }
   }
 
public:
   thread_pool() : done(false), joiner(threads)
   {
      size_t const thread_count = std::thread::hardware_concurrency();
 
      if (thread_count <= 1 || !work_queue.is_lock_free())
         throw std::logic_error("not compatible system for thread_pool");
 
      try {
         for (size_t i = 0; i < thread_count; ++i)
            threads.emplace_back(&thread_pool::worker_thread, this);
      }
      catch(...) {
         done = true;
         throw;
      }
   }
 
   ~thread_pool() { done = true; }
 
   template <typename FunctionType>
   std::future<typename std::result_of<FunctionType()>::type>
   submit(FunctionType f)
   {
      typedef typename std::result_of<FunctionType()>::type
            result_type;
      std::packaged_task<result_type()> task(std::move(f));
      std::future<result_type> res(task.get_future());
      work_queue.push(std::move(task));
      return res;
   }
};
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru