#include #include #include #include #include #include #include #include size_t ChannelSize = 100, Channels = 2; channel(size_t) * chans; size_t globalTotal = 0; int cons_counter = 0, prod_counter = 0; thread SelectConsumer {}; void main( SelectConsumer & this ) { size_t val, i = 0; try { for(;; i++ ) { waituntil( val << chans[0] ) {} or waituntil( val << chans[1] ) {} } } catch( channel_closed * e ) {} __atomic_fetch_add( &globalTotal, i, __ATOMIC_SEQ_CST ); } thread SelectProducer {}; void main( SelectProducer & this ) { try { for( size_t i = 0;; i++ ) { waituntil( chans[0] << i ) {} or waituntil( chans[1] << i ) {} } } catch( channel_closed * e ) {} } thread Consumer {}; void main( Consumer & this ) { size_t val, i = 0; try { for(;; i++ ) { remove( chans[1] ); } } catch( channel_closed * e ) {} __atomic_fetch_add( &globalTotal, i, __ATOMIC_SEQ_CST ); } thread Producer {}; void main( Producer & this ) { try { for( size_t i = 0;; i++ ) { insert( chans[1], i ); } } catch( channel_closed * e ) {} } int main( int argc, char * argv[] ) { processor p[3]; chans = aalloc( Channels ); for ( i; Channels ) chans[i]{ ChannelSize }; { Producer p; SelectProducer sp; Consumer c; SelectConsumer sc; sleep(10`s); for ( i; Channels ) close( chans[i] ); } adelete( chans ); printf("%zu\n", globalTotal); }