C++ CreateThread, MultiThreading, CriticalSection, WaitforSingleObject açıklamaları

Faydası olabilir diye C++ paylaşım yapmaya çalışıyorum.
Bu konumda, konu başlığındaki windows API (Application Programming Interface) multithreading  fonksiyonlarına örnek vermek istiyorum.

Thread nedir? multithread nedir?
Örneğin yürürken müzik dinleyip aynı anda sakız çiğneyen çocuk, 3 farklı bağımsız iş yapar. 3 tane thread olarak düşünebiliriz.
Her thread ayrı bir iş yapıyor ama aynı vücutta ve aynı beyinden yönetiliyor.
Bu multithreading tanımıdır.

CreateThread ile bir fonksiyonu, ana programı bekletmeden işletmek mümkün.
Örneğin, ana programda 10sn bekletme koyduğumuz zaman tüm program donuyor.
Ama CreateThread ile bir thread oluşturup, onun içine 10sn bekletme yazınca, sadece o thread donuyor, ana program (main thread) donmuyor.

WaitForSingleObject (Açılmış thread handle, Bekleme süresi);
Bu fonksiyon ise, ana programda thread oluşturma, CreateThread yaptıktan hemen sonra kod olarak eklenir.
Oluşturulan threadin bitmesini bekler. Bekleme süresinden fazla beklerse ana programı kaldıgı satırdan devam ettirir. While(1) içerisinde printf ile “ben thread1” olarak sürekli yazı basan bir thread’ı oluşturduktan sonra waitforsingleobject(infinite=sonsuz ,bitene kadar bekle demektir) yaparsak, o while1 bitmeyeceği için, ana program waitforsingleobjectten sonra gelen kodları işleyemeyecektir.

CriticalSection Örneğin bir programda bir diziye her thread 1-2-3 rakamı yazıyor diyelim. Yukarıdaki yürüyen çocuk örneğine göre, her thread kafasına göre anlık olarak diziye numara yazacaktır. Ana program ise bu diziyi anlık olarak printf ile gösteriyor olsun, sonuç olarak belirli bir anda dizide ne mevcut bilinemez;

peki her thread için sadece “ben threadX” diye yazı bastırstsak ve ardından waitforsingleobject koyarsak ne olur?
Cevap: Her thread işini görür, çıkar, waitforsingleobject deaktif olup sonraki kod satırı işlenir.

Critical section ne yapar?
Critical section’a giren bir thread, aynı programa(çalışan exeye) bağlı tüm threadleri anlık olarak kesip, LeaveCriticalSection komutuna kadar durdurur. Böylece bir thread, diziye yazı yazmaya başladığı an, öbürküler ona müdahele edemediğinden karışıklık önlenmiş olur.