В очередной раз довелось убедиться, что если нужно работать с голыми нитями, то 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. Вот еще один похожий пример.
Комментариев нет:
Отправить комментарий