-
Buat utas terpisah saat Anda tahu Anda tidak ingin menunggunya dengan
pthread_join()
. Satu-satunya keuntungan kinerja adalah ketika utas yang terlepas berakhir, sumber dayanya dapat segera dirilis alih-alih harus menunggu utas digabungkan sebelum sumber daya dapat dilepaskan. -
Adalah 'sah' untuk tidak bergabung dengan utas yang dapat digabungkan; tetapi biasanya tidak disarankan karena (seperti yang disebutkan sebelumnya) sumber daya tidak akan dirilis sampai utas digabungkan, jadi mereka akan tetap terikat tanpa batas waktu (sampai program keluar) jika Anda tidak bergabung.
Kapan saya harus membuat utas sebagai terlepas, langsung dari awal?
Setiap kali aplikasi tidak peduli kapan utas itu selesai dan tidak peduli tentang nilai pengembalian utasnya, baik (utas dapat mengomunikasikan nilai kembali ke utas/aplikasi lain melalui pthread_exit
).
Misalnya, dalam model aplikasi client-server, server dapat membuat thread baru untuk memproses setiap permintaan. Tetapi server itu sendiri tidak peduli dengan nilai pengembalian utas dari utas. Dalam hal ini, masuk akal untuk membuat terpisah utas.
Satu-satunya hal yang perlu dipastikan oleh server adalah bahwa permintaan yang diproses saat ini sudah selesai. Yang dapat dilakukan, hanya dengan keluar dari utas utama tanpa keluar dari seluruh program/aplikasi. Saat utas terakhir dalam proses keluar, aplikasi/program akan keluar secara alami.
Kodesemu mungkin terlihat seperti:
/* A server application */
void process(void *arg)
{
/* Detach self. */
pthread_detach(pthread_self());
/* process a client request. */
pthread_exit(NULL);
}
int main(void)
{
while (not_done) {
pthread_t t_id;
errno = pthread_create(&t_id, NULL, process, NULL);
if (errno) perror("pthread_create:");
}
/* There may be pending requests at this point. */
/* Just exit the main thread - not the whole program - so that remaining
requests that may still be processed can continue. */
pthread_exit(NULL);
}
Contoh lainnya bisa berupa daemon atau logger thread yang mencatat beberapa informasi secara berkala selama aplikasi berjalan.
Apakah itu menawarkan keunggulan kinerja vs. utas yang dapat digabungkan?
Dari segi performa, tidak ada perbedaan antara dapat digabungkan utas vs terlepas benang. Satu-satunya perbedaan adalah bahwa dengan utas yang terlepas, sumber dayanya (seperti tumpukan utas dan memori tumpukan apa pun yang terkait, dan seterusnya - apa yang dimaksud dengan "sumber daya" itu khusus untuk implementasi).
Apakah sah untuk tidak melakukan pthread_join() pada utas yang dapat digabungkan (secara default)?
Ya, legal untuk tidak bergabung dengan utas. pthread_join
adalah fungsi kenyamanan yang tidak perlu digunakan kecuali Anda membutuhkannya. Namun perhatikan bahwa utas yang dibuat dapat digabungkan utas secara default.
Contoh saat Anda mungkin ingin bergabung adalah saat utas melakukan "sepotong" pekerjaan yang terbagi di antara mereka. Dalam hal ini, Anda ingin memeriksa semua utas selesai sebelum melanjutkan. Paralelisme ladang tugas adalah contoh yang bagus.
Atau haruskah utas seperti itu selalu menggunakan fungsi detach() sebelum pthread_exit()ing?
Tidak perlu. Namun Anda sering kali ingin memutuskan apakah ingin dapat digabungkan atau terpisah utas pada saat pembuatan.
Perhatikan bahwa sementara utas yang dapat dilepas dapat dibuat dengan menyetel atribut PTHREAD_CREATE_DETACHED
dengan panggilan ke pthread_attr_setdetachstate
, sebuah utas memutuskan dapat memutuskan untuk melepaskan diri kapan saja, mis. dengan pthread_detach(pthread_self())
. Juga, utas yang memiliki id utas (pthread_t
) dari utas lain dapat dilepas dengan pthread_detach(thread_id);
.