#include <iostream>
#include <string>
size_t get_workers_count()
{
auto c = thread::hardware_concurrency();
if( c > 2 )
c -= 1;
else if( 1 == c )
c = 2;
return c;
}
void demo()
{
struct consumer_result
{
thread::id m_id;
size_t m_values_received;
uint64_t m_sum;
};
chrono::minutes{5},
300u,
const auto workers_count = get_workers_count();
vector< thread > workers;
workers.reserve( workers_count );
for( size_t i = 0; i != workers_count; ++i )
workers.emplace_back( thread{ [&values_ch, &results_ch] {
size_t received = 0u;
uint64_t sum = 0u;
receive( from( values_ch ),
[&sum, &received]( unsigned int v ) {
++received;
sum += v;
} );
so_5::send< consumer_result >( results_ch,
this_thread::get_id(), received, sum );
} } );
cout << "Workers created: " << workers_count << endl;
for( unsigned int i = 0; i != 10000; ++i )
so_5::send< unsigned int >( values_ch, i );
from( results_ch ).handle_n( workers_count ),
[]( const consumer_result & r ) {
cout << "Thread: " << r.m_id
<< ", values: " << r.m_values_received
<< ", sum: " << r.m_sum
<< endl;
} );
for_each( begin(workers), end(workers), []( thread & t ) { t.join(); } );
}
int main()
{
try
{
demo();
}
catch( const exception & ex )
{
cerr << "Error: " << ex.what() << endl;
}
return 0;
}