Concurrency and parallelism
CP.41
Минимизируйте создание и уничтожение потоков
Причина
Создание потока — это дорогостоящая операция.
Пример
void worker(Message m)
{
// обработка
}
void dispatcher(istream& is)
{
for (Message m; is >> m; )
run_list.push_back(new thread(worker, m));
}
Это создает thread для каждого сообщения, и run_list предположительно управляется для уничтожения этих задач после их завершения.
Вместо этого мы могли бы иметь набор предварительно созданных рабочих потоков, обрабатывающих сообщения
Sync_queue<Message> work;
void dispatcher(istream& is)
{
for (Message m; is >> m; )
work.put(m);
}
void worker()
{
for (Message m; m = work.get(); ) {
// обработка
}
}
void workers() // установить рабочие потоки (специально 4 рабочих потока)
{
joining_thread w1 {worker};
joining_thread w2 {worker};
joining_thread w3 {worker};
joining_thread w4 {worker};
}
Примечание
Если ваша система имеет хороший пул потоков, используйте его. Если ваша система имеет хорошую очередь сообщений, используйте ее.
Применение
???