Multithread vs Singlthread Derleme Farklılıkları

Cansiz

New member
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 :

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           
 }
}
Ş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!
 

HTML

Üst