GNU/Linux >> Belajar Linux >  >> Linux

return() versus pthread_exit() dalam fungsi mulai pthread

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


Linux
  1. Proses Waktu Mulai Dengan Zona Waktu?

  2. Bagaimana memberi nama utas di Linux?

  3. Apakah errno thread-safe?

  1. Apa yang dikembalikan malloc(0)?

  2. Thread ID vs Thread Handle

  3. Mengembalikan nilai x =os.system(..)

  1. Memulai Proses Pada Tty yang Berbeda?

  2. Cadangan tingkat byte Versus tingkat File?

  3. Skrip mulai systemd postgresql