(1) Dalam kode C++, gunakan return
menyebabkan tumpukan dibatalkan dan variabel lokal dihancurkan, sedangkan pthread_exit
hanya dijamin untuk meminta penangan pembatalan yang terdaftar dengan pthread_cancel_push()
. Pada beberapa sistem, mekanisme ini juga akan menyebabkan destruktor untuk variabel lokal C++ dipanggil, tetapi ini tidak dijamin untuk kode portabel --- periksa dokumentasi platform Anda.
Juga, di main()
, return
secara implisit akan memanggil exit()
, dan dengan demikian menghentikan program, sedangkan pthread_exit()
hanya akan menghentikan utas, dan program akan tetap berjalan sampai semua utas dihentikan atau beberapa utas memanggil exit()
, abort()
atau fungsi lain yang menghentikan program.
(2) Penggunaan return
berfungsi karena spesifikasi POSIX mengatakan demikian. Nilai yang dikembalikan disimpan di tempat pthread_join()
dapat mengambilnya kembali. Sumber daya yang digunakan oleh utas tidak diambil kembali hingga pthread_join()
disebut.
(3) Saya tidak pernah menggunakan nilai pengembalian utas di utas POSIX mentah. Namun, saya cenderung menggunakan fasilitas tingkat yang lebih tinggi seperti pustaka utas Boost, dan baru-baru ini pustaka utas C++ 0x, yang menyediakan sarana alternatif untuk mentransfer nilai antar utas seperti masa depan, yang menghindari masalah yang terkait dengan manajemen memori yang Anda menyinggung.
Saya pikir return
dari start_routine
lebih disukai, karena memastikan bahwa tumpukan panggilan dibatalkan dengan benar.
Ini bahkan lebih penting untuk C daripada C++ karena tidak memiliki sihir destruktor yang membersihkan kekacauan setelah keluar awal. Jadi kode Anda harus melalui semua bagian terakhir dari rutinitas pada tumpukan panggilan untuk melakukan free
dan sejenisnya.
Untuk alasan mengapa ini berhasil, ini sederhana
Jika start_routine kembali, efeknya akan seolah-olah ada panggilan implisit ke pthread_exit() menggunakan nilai kembalian start_routine sebagai status keluar
Untuk pengalaman pribadi saya, saya cenderung tidak banyak menggunakan status utas yang diakhiri. Inilah mengapa saya sering memulai utas detached
. Namun hal ini sangat bergantung pada aplikasinya dan tentunya tidak dapat digeneralisasikan.