#define _POSIX_C_SOURCE 200809L #include /* waitpid */ #include /* close */ #include /* uint64_t */ #include /* memcmp */ #include /* fcntl, F_*, FD_* */ #include #include #include /* Občas je výhodné delší výpočet provádět asynchronně, tzn. tak, * aby zbytek programu mohl během výpočtu normálně pracovat (a * například reagovat na vnější události). Vaším úkolem bude * naprogramovat dvojici podprogramů ‹async_start› a ‹async_wait›, * které realizují takovýto asynchronní výpočet v pomocném vlákně. * Pro jednoduchost bude vstupem výpočtu dvojice 64b čísel a * výstupem výpočtu jedno 64bitové číslo. * * Podprogram ‹async_start› obdrží dva parametry: * * • ‹func› je ukazatel na funkci, kterou chceme provést, * • ‹arg› je 64bitové číslo, které bude vstupem pro ‹func›. * * Výsledkem ‹async_start› je ukazatel ‹handle›, který později * předáme podprogramu ‹async_wait› a obdržíme tak výsledek výpočtu. * Podprogram ‹async_wait› zároveň uvolní veškeré zdroje s ‹handle› * spojené. * * Není-li možné vytvořit nový proces, výsledkem ‹async_start› bude * nulový ukazatel. Výsledkem ‹async_wait› je v případě úspěchu 0, * jinak -1. Výsledek výpočtu je volajícímu předán výstupním * parametrem ‹result›. */ void *async_start( uint64_t ( *func )( uint64_t, uint64_t ), uint64_t arg_1, uint64_t arg_2 ); int async_wait( void *handle, uint64_t *result ); /* ┄┄┄┄┄┄┄ %< ┄┄┄┄┄┄┄┄┄┄ následují testy ┄┄┄┄┄┄┄┄┄┄ %< ┄┄┄┄┄┄┄ */ uint64_t slowpoke( uint64_t a, uint64_t b ) { sleep( 5 ); return a * b; } int main( void ) { void *a_handle = async_start( slowpoke, 1, 1 ), *b_handle = async_start( slowpoke, 2, 2 ), *c_handle = async_start( slowpoke, 3, 3 ); alarm( 7 ); uint64_t a_res, b_res, c_res; assert( async_wait( a_handle, &a_res ) == 0 ); assert( async_wait( b_handle, &b_res ) == 0 ); assert( async_wait( c_handle, &c_res ) == 0 ); assert( a_res == 1 ); assert( b_res == 4 ); assert( c_res == 9 ); return 0; }