(1) V kódu C++ pomocí return
způsobí odvinutí zásobníku a zničení lokálních proměnných, zatímco pthread_exit
je zaručeno, že vyvolá pouze obslužné programy zrušení registrované s pthread_cancel_push()
. Na některých systémech tento mechanismus také způsobí volání destruktorů pro lokální proměnné C++, ale u přenosného kódu to není zaručeno --- zkontrolujte dokumentaci k vaší platformě.
Také v main()
, return
bude implicitně volat exit()
, a tím ukončit program, zatímco pthread_exit()
pouze ukončí vlákno a program zůstane spuštěný, dokud se všechna vlákna neukončí nebo některá vlákna nezavolají exit()
, abort()
nebo jinou funkci, která ukončí program.
(2) Použití return
funguje, protože to říká specifikace POSIX. Vrácená hodnota je uložena v místě pthread_join()
může to získat. Prostředky používané vláknem nejsou získány zpět, dokud pthread_join()
se nazývá.
(3) Nikdy nepoužívám návratovou hodnotu vlákna v nezpracovaných vláknech POSIX. Mám však tendenci používat zařízení vyšší úrovně, jako je knihovna vláken Boost a v poslední době knihovna vláken C++0x, které poskytují alternativní prostředky pro přenos hodnot mezi vlákny, jako jsou futures, které zabraňují problémům spojeným se správou paměti, které narážet na.
Myslím, že return
z start_routine
je vhodnější, protože zajišťuje správné odvíjení zásobníku volání.
To je pro C ještě důležitější než C++, protože nemá destrukční kouzlo, které vyčistí nepořádek po předběžných výstupech. Váš kód by tedy měl projít všemi závěrečnými částmi rutin v zásobníku volání, aby provedl free
s a podobně.
Proč to funguje, je to jednoduché
Pokud se start_routine vrátí, efekt by měl být takový, jako by došlo k implicitnímu volání funkce pthread_exit() s použitím návratové hodnoty ofstart_routine jako stavu ukončení
Pro svou osobní zkušenost mám tendenci stav ukončených vláken příliš nepoužívat. To je důvod, proč mám vlákna často spuštěna detached
. Ale to by mělo hodně záviset na aplikaci a rozhodně to nelze zobecnit.