Eğer yazılan kod, eş zamanlı olarak birden fazla iş parçacığı (thread) tarafından işletilirken fonksiyonlarını tam ve eksiksiz olarak yerine getirebiliyorsa, bu kod parçacığı thread safe‘tir denir. Çok işlemli (multi threaded) hesaplamanın en popüler sorunlarından biridir.
Thread safety ile ilgili yazılım hataları, çok büyük ve yıkıcı sonuçları ile biliniyor. Bu sebepten dolayı, bu konuyu buraya taşımak istedim.
Eş zamanlı olarak birden fazla iş parçası tarafından kullanılacak kaynak kodun
- Kendisi yada kullandığı alt prosedürler yerel kaynaklar haricinde (stack hariç) kaynaklara ulaşıyor olabilir.
- İçerisinde bazı nicelikler dışarıdan müdahale ile değişiyor olabilir.
ve belki de en önemlisi
- Birden fazla iş parçası ortak bir kaynağa erişiyor olabilir.
Bu gibi durumlarda thread safety ile ilgili riskleri göz önünde tutmakta fayda vardır.
Peki, test etmemizi gerektiren bir risk mevcut ve thread safe olması gereken bir bir kod bloğumuz var ise nasıl test edeceğiz?
Thread safety testi için, başta yaptığımız temel tanıma dönerek, kod grubunu birden fazla iş parçası tarafından eş zamanlı çalıştırmamız gerekiyor. İyi bir test için ise, söz konusu kodun gerçekten eş zamanlı çalıştığından emin olmalıyız.
Bunun için yapmamız gereken çok basit. Aşağıdaki örnek C kaynak koduna bakalım.
.....
// işlemi çoklayalım
int iForkRetVal = fork();
if( 0 < iForkRetVal ) {
// Alt işlem
vChildProcessPseudoSafeLock();
/*
Thread Safe işlem
*/
#ifdef TEST_TS
sleep(120);
#endif
vChildProcessPseudoSafeUnlock();
} else {
// Ana işlem
vParentSafeNOP();
}
…
Thread safety kilidimiz içerisine eklediğimiz sleep komutu ile bu iş parçasının kilitli durumda en az iki dakika kalacağını garanti altına almış olduk. Bu sayede çakışma durumunu gözlemlemek için bin adet iş parçası üretmemiz de gerekmeyecektir.
Post a Comment