Dobrý den,
sice tento příspěvěk zasílám poměrně dlouho po uvěřejnění článku, přesto si myslím, že by mohl být užitečný, jelikož příklad vícevkláknového programu ve článku skutečně obsahuje drobnou chybu.
Pozn.: zkoušel jsem příklad s drobnou modifikací, kdy jsem vypisoval celý řetězec a nikoliv pouze jeden znak.
Chyba spočívala v tom, že program nezačal nic vypisovat a ihned se ukončil. To lze elegantně obejít tím, že do struktury přidáme další prvek ret:
struct char_print_params { char character; int count; char ret; };
Na konci funkce vykonávané vláknem nastavíme hodnotu prvku ret na jedna.
void *char_print(void *parameters) { struct char_print_params *p = (struct char_print_params *) parameters; int i; for(i = 0; p->count>i; ++i) fputc(p->character, stderr); p->ret = 1; return NULL; }
Ve funkci main() musíme inicializovat obe hodnoty ret na nulu a testovat v nějaké smičce nenulovost návratové hodnoty obou argumentů.
while( thread1_args.ret==0 && thread2_args.ret==0){ wait(100); }
Asi to není uplně ideální řešení, ale je to lepší než dostat rezavým drátem do oka ;-).