#define _POSIX_C_SOURCE 200809L #include /* alarm */ #include /* uint64_t */ #include /* Tématem této přípravy budou asynchronní výpočty – Vaším úkolem * bude naprogramovat pomocný podprogram ‹gather›, který obdrží: * * • ‹func› je ukazatel na výpočetní funkci, kterou bude spouštět, * • ‹inputs› je pole vstupních hodnot, * • ‹results› je pole výsledků, * • ‹count› je velikost těchto polí. * * Podprogram ‹gather› spustí výpočet ‹func› pro každou vstupní * hodnotu (položku pole ‹inputs›) v samostatném vlákně a výsledky * uloží na odpovídající index pole ‹results›. Výsledkem bude 0 * proběhne-li vše úspěšně, jinak -1. */ int gather( uint64_t ( *func )( uint64_t ), uint64_t *inputs, uint64_t *results, int count ); /* ┄┄┄┄┄┄┄ %< ┄┄┄┄┄┄┄┄┄┄ následují testy ┄┄┄┄┄┄┄┄┄┄ %< ┄┄┄┄┄┄┄ */ static uint64_t slowpoke( uint64_t val ) { sleep( 5 ); return val * 13; } int main( void ) { alarm( 7 ); uint64_t inputs[ 8 ] = { 1, 2, 3, 4, 5, 6, 7, 8 }, results[ 8 ]; assert( gather( slowpoke, inputs, results, 8 ) == 0 ); for ( int i = 1; i <= 8; ++i ) assert( results[ i - 1 ] == ( uint64_t ) i * 13 ); return 0; }