Saya melihat pertanyaan itu telah diaktifkan kembali dengan hadiah, sekarang menanyakan untuk apa kegunaan praktisnya yield
. Saya akan memberikan contoh dari pengalaman saya.
Seperti yang kita ketahui, yield
memaksa thread pemanggil untuk melepaskan prosesor tempat ia berjalan sehingga thread lain dapat dijadwalkan untuk berjalan. Ini berguna ketika utas saat ini telah menyelesaikan tugasnya untuk saat ini tetapi ingin segera kembali ke depan antrean dan memeriksa apakah beberapa kondisi telah berubah. Apa yang membedakannya dari variabel kondisi? yield
memungkinkan utas kembali lebih cepat ke status berjalan. Saat menunggu pada variabel kondisi, utas ditangguhkan dan perlu menunggu utas yang berbeda untuk memberi sinyal bahwa itu harus dilanjutkan.yield
pada dasarnya mengatakan "izinkan utas yang berbeda untuk berjalan, tetapi izinkan saya untuk kembali bekerja segera karena saya mengharapkan sesuatu untuk berubah dalam keadaan saya dengan sangat cepat". Ini mengisyaratkan pemintalan yang sibuk, di mana suatu kondisi dapat berubah dengan cepat tetapi menangguhkan utas akan menyebabkan kinerja yang buruk.
Tapi cukup mengoceh, inilah contoh konkretnya: pola paralel muka gelombang. Contoh dasar dari masalah ini adalah menghitung "pulau" individu 1s dalam larik dua dimensi yang diisi dengan 0s dan 1s. Sebuah "pulau" adalah sekumpulan sel yang berdekatan satu sama lain baik secara vertikal maupun horizontal:
1 0 0 0
1 1 0 0
0 0 0 1
0 0 1 1
0 0 1 1
Di sini kita memiliki dua pulau 1: kiri atas dan kanan bawah.
Solusi sederhananya adalah dengan membuat lintasan pertama di seluruh larik dan mengganti 1 nilai dengan penghitung tambahan sehingga pada akhirnya setiap 1 diganti dengan nomor urutnya dalam urutan mayor baris:
1 0 0 0
2 3 0 0
0 0 0 4
0 0 5 6
0 0 7 8
Pada langkah berikutnya, setiap nilai diganti dengan nilai minimum antara nilai itu sendiri dan nilai tetangganya:
1 0 0 0
1 1 0 0
0 0 0 4
0 0 4 4
0 0 4 4
Sekarang kita dapat dengan mudah menentukan bahwa kita memiliki dua pulau.
Bagian yang ingin kita jalankan secara paralel adalah langkah di mana kita menghitung minimum. Tanpa membahas terlalu banyak detail, setiap utas mendapatkan baris secara berselang-seling dan bergantung pada nilai yang dihitung oleh utas yang memproses baris di atas. Oleh karena itu, setiap utas perlu sedikit tertinggal di belakang utas yang memproses baris sebelumnya, tetapi juga harus mengikuti dalam waktu yang wajar. Lebih detail dan implementasinya disajikan sendiri dalam dokumen ini . Perhatikan penggunaan sleep(0)
yang lebih atau kurang C setara yield
.
Dalam hal yield
ini digunakan untuk memaksa setiap utas secara bergiliran menjeda, tetapi karena utas yang memproses baris yang berdekatan akan maju dengan sangat cepat untuk sementara itu, variabel kondisi akan membuktikan pilihan yang menghancurkan.
Seperti yang Anda lihat, yield
ini adalah pengoptimalan butiran yang cukup halus. Penggunaannya di tempat yang salah misal menunggu pada kondisi yang jarang berubah akan menyebabkan penggunaan CPU yang berlebihan.
Maaf atas ocehan panjangnya, semoga aku membuat diriku jelas.