Sorunun bir ödülle yeniden aktive edildiğini görüyorum, şimdi pratik kullanımlarının ne olduğunu soruyorum yield
. Deneyimlerimden bir örnek vereceğim.
Bildiğimiz gibi yield
, çağıran iş parçacığını, üzerinde çalıştığı işlemciyi bırakmaya zorlar, böylece başka bir iş parçacığı çalışacak şekilde programlanabilir. Bu, mevcut iş parçacığı şimdilik işini bitirdiğinde ancak kuyruğun başına hızla dönmek ve bazı koşulların değişip değişmediğini kontrol etmek istediğinde kullanışlıdır. Bunun bir koşul değişkeninden farkı nedir? yield
iş parçacığının çalışma durumuna çok daha hızlı dönmesini sağlar. Bir koşul değişkenini beklerken, iş parçacığı askıya alınır ve başka bir iş parçacığının devam etmesi gerektiğini bildirmesi için beklemesi gerekir.yield
temelde "farklı bir iş parçacığının çalışmasına izin ver, ancak durumumda bir şeyin çok çok hızlı bir şekilde değişmesini beklerken çok kısa sürede işe dönmeme izin ver" diyor. Bu, bir koşulun hızla değişebildiği, ancak ipliğin askıya alınmasının büyük bir performans düşüşüne yol açacağı yoğun eğirmeye yönelik ipuçları verir.
Ama yeterince gevezelik, işte somut bir örnek: dalga cephesi paralel patern. Bu sorunun temel bir örneği, 0'lar ve 1'ler ile dolu iki boyutlu bir dizide 1'lerin tek tek "adalarını" hesaplamaktır. "Ada", dikey veya yatay olarak birbirine bitişik olan bir hücre grubudur:
1 0 0 0
1 1 0 0
0 0 0 1
0 0 1 1
0 0 1 1
Burada iki adet 1 adamız var: üst sol ve sağ alt.
Basit bir çözüm, tüm dizide bir ilk geçiş yapmak ve 1 değerleri artan bir sayaçla değiştirmektir, böylece sonunda her 1, satır ana sırasına göre sıra numarasıyla değiştirilir:
1 0 0 0
2 3 0 0
0 0 0 4
0 0 5 6
0 0 7 8
Bir sonraki adımda, her bir değer, kendisi ve komşularının değerleri arasındaki minimum değerle değiştirilir:
1 0 0 0
1 1 0 0
0 0 0 4
0 0 4 4
0 0 4 4
Artık iki adamız olduğunu kolayca belirleyebiliriz.
Paralel olarak çalışmak istediğimiz kısım, minimumları hesapladığımız adımdır. Çok fazla ayrıntıya girmeden, her iş parçacığı aralıklı olarak satır alır ve yukarıdaki satırı işleyen iş parçacığı tarafından hesaplanan değerlere dayanır. Bu nedenle, her bir iş parçacığı, önceki satırı işleyen iş parçacığının biraz gerisinde kalmalı, ancak aynı zamanda makul bir süre içinde devam etmelidir. Daha fazla ayrıntı ve bir uygulama bu belgede tarafımdan sunulmuştur . Kullanımının sleep(0)
aşağı yukarı C eşdeğeri olduğuna dikkat edin yield
.
Bu durumda yield
, her bir iş parçacığını sırayla durmaya zorlamak için kullanıldı, ancak bitişik sırayı işleyen iş parçacığı bu arada çok hızlı ilerleyeceğinden, bir koşul değişkeni feci bir seçim olacaktır.
Gördüğünüz gibi yield
oldukça ince bir optimizasyon. Yanlış yerde kullanılması, örneğin nadiren değişen bir koşulu beklemek, CPU'nun aşırı kullanımına neden olur.
Uzun gevezelik için özür dilerim, umarım kendimi açıkladım.