Cansiz
New member
- Katılım
- 7 Ocak 2006
- Mesajlar
- 2,048
- Reaction score
- 0
- Puanları
- 0
- Yaş
- 35
Standart c kütüphaneleri 1970li yıllarda kabul edilirken, kavram olarak henüz ortada multithread zihniyeti yoktu. Bu sebeple, birçok kütüphanede farklı threadlerin aynı anda birçok iş yapması düşünülmemişti. Bunlara örnek vermek gerekirse aşağıdaki program parçacağını düşünün :
Şimdi errno değişkeni, standart c için global bir değişkendir, bir hata anında bir değer atanır.
Diyelimki, sizin system çağırınızdan hemen sonra bellek hatası oluştu ve errno’nun ENOMEM değerini almasını bekliyorsunuz, ve if döngüsüne girdiğiniz anda başka bir thread’de yaptığınız işlemler sonucu bir taşma hatası oluştu, bu durumda errno hemen E2BIG olarak hatandı. Gördüğünüz gibi sizin o an ilgilendiğiniz thread’deki kontrol etmek istediğiniz errno artık doğru değeri gösteremiyor. Bunun dışında, errno,_doserrno,strtok,_wcstok,strerror,_strerror,gmtime vs de multihthread düşünülmeden yazılmış ve multithreadde sorun çıkartabilecek fonksiyonlardır.
( strtok : burada tanımlanan internal değişkenler statictir, dolayısıyla başka bir thread bu static değişkenleri değiştirebilir )
Bu sebepten dolayı, multithread ortamda çalışmak isteyen c/c++ programları özel bir initialize işlemi gerektirir. Örnek olarak errno değişkeninin global olmaktan çıkıp, thread için lokal olması gerekmektedir.
Umarım şimdi, visual c++ da derleme yaparken multithread veya singlethread neden seçtiğimizi anlamışsınızdır.
Yazının orjinal halini : Jeffrey Richter, Advanced windows programming de bulabilirsiniz.
Alıntıdır!
PHP:
BOOL bFailure = (system(“NOTEPAD.EXE c:\\autoexec.bat) == -1);If(fFailure){
switch(errno){
case E2BIG: break; //taşma hatası olacak
case ENOENT: break; // command line hatası
case ENOMEM: break;//memory az
}
}
Diyelimki, sizin system çağırınızdan hemen sonra bellek hatası oluştu ve errno’nun ENOMEM değerini almasını bekliyorsunuz, ve if döngüsüne girdiğiniz anda başka bir thread’de yaptığınız işlemler sonucu bir taşma hatası oluştu, bu durumda errno hemen E2BIG olarak hatandı. Gördüğünüz gibi sizin o an ilgilendiğiniz thread’deki kontrol etmek istediğiniz errno artık doğru değeri gösteremiyor. Bunun dışında, errno,_doserrno,strtok,_wcstok,strerror,_strerror,gmtime vs de multihthread düşünülmeden yazılmış ve multithreadde sorun çıkartabilecek fonksiyonlardır.
( strtok : burada tanımlanan internal değişkenler statictir, dolayısıyla başka bir thread bu static değişkenleri değiştirebilir )
Bu sebepten dolayı, multithread ortamda çalışmak isteyen c/c++ programları özel bir initialize işlemi gerektirir. Örnek olarak errno değişkeninin global olmaktan çıkıp, thread için lokal olması gerekmektedir.
Umarım şimdi, visual c++ da derleme yaparken multithread veya singlethread neden seçtiğimizi anlamışsınızdır.
Yazının orjinal halini : Jeffrey Richter, Advanced windows programming de bulabilirsiniz.
Alıntıdır!