GNU/Linux >> Znalost Linux >  >> Linux

return() versus pthread_exit() ve funkcích pthread start

(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.


Linux
  1. Začít proces na jiném Tty?

  2. Zálohy na úrovni bajtů versus zálohy na úrovni souborů?

  3. Funkce v proměnných Shell?

  1. Čas zahájení procesu s časovým pásmem?

  2. Povolit služby v Linuxu

  3. Jak pojmenovat vlákno v Linuxu?

  1. Je errno vlákno bezpečné?

  2. Co vrátí malloc(0)?

  3. pthread_exit vs. návrat