Diğer yanıtların da belirttiği gibi, bu kesinlikle satıcıya özgüdür çünkü C ++ standardı iş parçacığından bahsetmez (bu, C ++ 0x'de değişir).
GCC, iş parçacığı güvenliği ve I / O hakkında çok fazla söz vermez. Ancak vaat ettiği şeyin belgeleri burada:
Muhtemelen anahtar konu şudur:
__Basic_file türü, C stdio katmanının etrafındaki küçük sarmalayıcıların bir koleksiyonudur (yine, Yapı altındaki bağlantıya bakın). Kendimizi kilitlemiyoruz, sadece fopen, fwrite vb. Çağrılara geçiyoruz.
Öyleyse, 3.0 için, "G / Ç için çoklu okuma güvenli mi" sorusu yanıtlanmalıdır, "platformunuzun C kitaplığı G / Ç için güvenli mi?" Bazıları varsayılan olarak, bazıları değildir; birçoğu, değişen iş parçacığı güvenliği ve verimliliği ödünleşimleriyle birlikte C kitaplığının çoklu uygulamalarını sunar. Siz, programcı, her zaman birden fazla iş parçacığı ile ilgilenmeniz gerekir.
(Örnek olarak, POSIX standardı, C stdio FILE * işlemlerinin atomik olmasını gerektirir. POSIX uyumlu C kitaplıklarında (örneğin, Solaris ve GNU / Linux üzerinde) FILE * lerde işlemleri serileştirmek için dahili bir mutex vardır. Bununla birlikte, yine de ihtiyacınız var bir iş parçacığında fclose (fs) çağırmak ve ardından diğerinde fs erişimi gibi aptalca şeyler yapmamak.)
Dolayısıyla, platformunuzun C kitaplığı iş parçacığı açısından güvenli ise, fstream I / O işlemleriniz en düşük seviyede iş parçacığı açısından güvenli olacaktır. Akış biçimlendirme sınıflarında bulunan verileri değiştirmek gibi daha yüksek seviyeli işlemler için (örneğin, bir std :: ofstream içinde geri aramaların ayarlanması), bu tür erişimleri diğer kritik paylaşılan kaynaklar gibi korumanız gerekir.
Bahsedilen 3.0 zaman diliminde herhangi bir şeyin değişip değişmediğini bilmiyorum.
MSVC'nin iş parçacığı güvenlik belgeleri iostreams
şurada bulunabilir: http://msdn.microsoft.com/en-us/library/c9ceah3b.aspx :
Tek bir nesne, birden çok iş parçacığından okumak için iş parçacığı güvenlidir. Örneğin, bir A nesnesi verildiğinde, A'yı eşzamanlı olarak iplik 1'den ve 2'den okumak güvenlidir.
Tek bir nesneye tek bir iş parçacığı tarafından yazılıyorsa, o nesneye aynı veya diğer iş parçacığı üzerindeki tüm okuma ve yazma işlemleri korunmalıdır. Örneğin, bir A nesnesi verildiğinde, eğer 1. iplik A'ya yazıyorsa, 2. ipliğin A'dan okuması veya yazması engellenmelidir.
Başka bir iş parçacığı aynı türün farklı bir örneğini okuyor veya yazıyor olsa bile, bir türün bir örneğini okumak ve yazmak güvenlidir. Örneğin, aynı türden A ve B nesneleri verildiğinde, A evre 1'de yazılıyorsa ve B evre 2'de okunuyorsa güvenlidir.
...
iostream Sınıfları
İostream sınıfları, bir istisna dışında diğer sınıflarla aynı kuralları izler. Birden çok iş parçacığından bir nesneye yazmak güvenlidir. Örneğin, evre 1, evre 2 ile aynı anda cout'a yazabilir. Bununla birlikte, bu, iki evrenin birbirine karıştırılmasıyla sonuçlanabilir.
Not: Bir akış arabelleğinden okumak, bir okuma işlemi olarak kabul edilmez. Bir yazma işlemi olarak düşünülmelidir çünkü bu sınıfın durumunu değiştirir.
Bu bilgilerin cl.exe
MSVC'nin en son sürümü için olduğunu unutmayın (şu anda VS 2010 / MSVC 10 / 16.x için). Sayfadaki açılır bir kontrol kullanarak MSVC'nin eski sürümleri için bilgileri seçebilirsiniz (ve bilgiler eski sürümler için farklıdır).