Sebagian besar jawaban di atas berbicara tentang kinerja dan operasi simultan. Saya akan mendekati ini dari sudut yang berbeda.
Mari kita ambil contoh program emulasi terminal yang sederhana. Anda harus melakukan hal-hal berikut:
- perhatikan karakter yang masuk dari sistem jarak jauh dan tampilkan
- perhatikan hal-hal yang datang dari keyboard dan kirimkan ke sistem jarak jauh
(Emulator terminal nyata melakukan lebih banyak, termasuk berpotensi menggemakan hal-hal yang Anda ketikkan pada layar juga, tetapi kami akan melewati itu untuk saat ini.)
Sekarang loop untuk membaca dari remote adalah sederhana, sesuai pseudocode berikut:
while get-character-from-remote:
print-to-screen character
Loop untuk memantau keyboard dan pengiriman juga sederhana:
while get-character-from-keyboard:
send-to-remote character
Masalahnya adalah Anda harus melakukan ini secara bersamaan. Kode sekarang harus terlihat lebih seperti ini jika Anda tidak memiliki threading:
loop:
check-for-remote-character
if remote-character-is-ready:
print-to-screen character
check-for-keyboard-entry
if keyboard-is-ready:
send-to-remote character
Logikanya, bahkan dalam contoh sederhana yang disengaja ini yang tidak memperhitungkan kompleksitas komunikasi dunia nyata, cukup dikaburkan. Dengan threading, bagaimanapun, bahkan pada satu inti, dua pseudocode loop dapat eksis secara independen tanpa menjalin logikanya. Karena kedua utas tersebut sebagian besar terikat I / O, mereka tidak menempatkan beban yang berat pada CPU, meskipun sebenarnya, lebih boros sumber daya CPU daripada loop terintegrasi.
Sekarang tentu saja penggunaan dunia nyata lebih rumit daripada yang di atas. Tetapi kompleksitas dari loop terintegrasi naik secara eksponensial saat Anda menambahkan lebih banyak kekhawatiran ke aplikasi. Logikanya semakin terfragmentasi dan Anda harus mulai menggunakan teknik seperti mesin negara, coroutine, dan lain-lain untuk mendapatkan hal-hal yang dapat dikelola. Dapat dikelola, tetapi tidak dapat dibaca. Threading membuat kode lebih mudah dibaca.
Jadi mengapa Anda tidak menggunakan threading?
Nah, jika tugas Anda terikat pada CPU bukannya I / O-terikat, threading sebenarnya memperlambat sistem Anda. Performa akan menderita. Banyak, dalam banyak kasus. ("Meronta-ronta" adalah masalah umum jika Anda menjatuhkan terlalu banyak utas terikat-CPU. Anda menghabiskan lebih banyak waktu mengubah utas aktif daripada menjalankan sendiri isi utas.) Juga, salah satu alasan logika di atas adalah begitu sederhana sehingga saya dengan sengaja memilih contoh yang simplistis (dan tidak realistis). Jika Anda ingin mengulangi apa yang diketik ke layar maka Anda memiliki dunia baru yang terluka saat Anda memperkenalkan penguncian sumber daya bersama. Dengan hanya satu sumber daya yang dibagikan ini tidak terlalu menjadi masalah, tetapi itu mulai menjadi masalah yang lebih besar dan lebih besar karena Anda memiliki lebih banyak sumber daya untuk dibagikan.
Jadi pada akhirnya, threading adalah tentang banyak hal. Sebagai contoh, ini tentang membuat proses I / O-terikat lebih responsif (meskipun secara keseluruhan kurang efisien) seperti yang telah dikatakan beberapa orang. Ini juga tentang membuat logika lebih mudah diikuti (tetapi hanya jika Anda meminimalkan keadaan bersama). Ini tentang banyak hal, dan Anda harus memutuskan apakah kelebihannya lebih besar daripada kerugiannya berdasarkan kasus per kasus.