2011-12-05 20 views
8

Mac OS X'in C standart kitaplığı uygulamasında iş parçacığı güvenli olan tam bir işlev listesi var mı?C standardı kitaplığının OS X üzerinde güvenliğini sağlama

Özellikle glibc ve f*() işlevleri açısından iyi bir yanıt here ve OS X ile ilgili herhangi bir kaynak bulamadım. Böyle bir şey var mı?

Örneğin, strptime() ve strftime() iş parçacığı güvenli midir? printf()? Bunlar, dağınık kalmak istemediğim dahili tamponlara sahip olabileceklerdir.

+0

Bir yan açıklama olarak (Dave ve ruakh cevap verseniz bile) Standart işlevlerin iş parçacığı güvenli olması garanti edilir, bunun uygulanması genellikle yüksek bir performans cezası ile birlikte gelir. Printf'n gibi şeyler, kodunuzu serileştirme eğilimine sahip olduklarından dolayı kötü şöhrete sahiptirler. –

cevap

3

Tek Unix Spesifikasyonu a fairly short list of functions that are allowed to be non–thread-safe ("Legacy Feature Group" içerisindeki işlevlerin orada listelenmemesine rağmen thread-non-safe olarak kullanılmasına izin vermesi dışında) verir. List, onun cevabında Dave'in bahsettiği strtok()'u içerir, ancak , strptime() veya strftime()'u veya printf()'u içerir.

This StackOverflow answer OS X spec yukarıdaki aşamada destek yaptığı, buna oldukça benzer bir soruya cevap olarak, iddia, bu yüzden muhtemelen kullanılacak en iyi liste olduğunu düşünüyorum. (Muhtemelen bu sorunun geri kalanıyla da ilgileneceksiniz, ve diğer cevapta da, bu arada.)

2

Bazı sihirli hatırlama gücüne sahip gibi görünen herhangi bir işlev, büyük olasılıkla diş güvenli değildir. free() beklemediğiniz bir işaretçiyi döndüren herhangi bir işlev çok sık iş parçacığı güvenli değildir.

Gerçekten endişelenmeniz gereken pek çok işlevle ilgili olarak char* veya struct foo*. Bu mükemmel bir kural olmasa da, bu genellikle bir tür statik depolama alanına sahip ve iş parçacığı güvenli olmayan bir işlevin göstergesidir.

strtok() basit bir örnektir ve thread-safe olan strtok_r() tarafından başarılı olmuştur. Birçok iş parçacığı için güvenli olmayan işlevler için, function_r() (reentrant için r) vardır.