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 ;-).