вторник, 15 марта 2016 г.

[prog.c++] CSP-шные каналы при работе с голыми нитями -- это удобная штука, как оказалось...

В очередной раз довелось убедиться, что если нужно работать с голыми нитями, то CSP-шные каналы могут сильно упростить жизнь. Вот, скажем, потребовалось:

  • запустить три рабочих нити;
  • дождаться от них уведомлений о начале работы;
  • дать какое-то время рабочим нитям для выполнения ими каких-то действий;
  • каждой рабочей нити дается сигнал на завершение работы;
  • от каждой рабочей нити принимается сообщение с результатами работы.

На CSP-шных каналах сделать это можно посредством трех типов сообщений и двух каналов:

struct ready {};
struct done {};
struct worker_result {...};

// Канал для передачи информации рабочим потокам.
auto cmd_ch = env.create_mchain( make_unlimited_mchain_params() );
// Канал для получения информации от рабочих потоков.
auto info_ch = env.create_mchain( make_unlimited_mchain_params() );

... // Запуск рабочих потоков с привязкой их к cmd_ch и info_ch.

// Ожидаем трех подтверждений о том, что рабочие потоки стартовали.
receive( from(info_ch).handle_n(3), [](ready){} );

... // Даем какое-то время на работу потокам.

// Указываем рабочим потокам, что пора завершать свою работу.
// Каждый поток вычитывает всего одно сообщение done из канала,
// поэтом просто отсылаем три сообщения done, по одному для каждого потока.
send< done >( cmd_ch );
send< done >( cmd_ch );
send< done >( cmd_ch );

// Ожидаем три результата от рабочих потоков.
receive( from(info_ch).handle_n(3), [](const worker_result & r) {...} );

PS. Вот еще один похожий пример.

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