2010-03-01 22 views
15

Linux ve Win32 soket API'lerini kullanıyorum. Programımda, birden çok ileti bir yuva tutamacını paylaşıyor. Özellikle, birden fazla iş parçacığı paylaşılan yuva tutamacıyla (yani, aynı bağlantı noktası) send numaralı telefonu arar. Bu durumda, iplik güvenliği için bir kilit koymak zorunda mıyım? Cevabı bulamadım. Bir test yapabilirim, ancak deneyimlerinizi duymak istiyorum.C soketi API iş parçacığı güvenli midir?

EDIT: Soket aracılığıyla bu tür veri gönderme işleminin atomik işlem olmadığını biliyorum. İplik güvenliği için kesinlikle bir muteks kullanmalıyız. Ancak, sistem API'sinin kendi iç kilidi olup olmadığını merak ediyordum. Eğer öyleyse, kendi kilidimizi koyarak ihmal edebiliriz.

Bu soru, fprintf işlevine uygulanabilir. Bu sistem API'larının kendi kilitlerine sahip olacağını merak ediyorum. Benim deneyimime göre, fprintf'un birden fazla iş parçacığından çağrılması, bir dosya veya stdout üzerinde yarışlar olsa da (yani, tutarsız veya öngörülemeyen çıkışlar olsa da, program çökmedi), programımı öldürmedi. veri yapısı.

+0

Aynı sokete okuma ve yazma birden fazla iş parçacığı benim düşünceme göre de facto tasarım sorunudur. – theMayer

cevap

0

Verileri bir soket üzerinden göndermek atomik bir işlem değildir; atomik olmayan herhangi bir işlem kilitleme/senkronizasyon gerektirecektir. Bu platformdan bağımsızdır.

+1

Teşekkürler. Evet, bunun atomik işlem olmadığını biliyorum. Ancak, sistem API'sinin kendi iç kilidi olup olmadığını merak ediyordum. – minjang

+4

Ama eğer bunu yaparlarsa atomik yaparlar ... – EJP

11

Soketler C++ Standard'ın bir parçası değildir, bu nedenle uygulamaya bağlıdır. Genel olarak send atomik bir işlem olmadığı için vida dişleri güvenli değildir. Daha fazla bilgi için this discussion numaralı telefonu kontrol edin. DÜZENLEME: İç yapıları korumak için işletim sistemi dahili kilitlere sahip olabilir veya sahip olamazdı. Uygulamaya bağlı. Yani buna güvenmemelisin.

+0

POSIX gönder/recv gibi sesler bağlantınıza ve bu tartışmaya dayalı olarak güvenlidir: http://stackoverflow.com/a/1981439/602245 – Brett

0

Hayır, kabul ile oluşturulan değişkenin muteks olması gerekmez. İş parçacıklarının kullandığı veriler en azından semafor olmalıdır.

sem_t* sem_data; 
2

Birden çok soket close() dosya tanıtıcısı eşzamanlı ortamda son derece tehlikeli çağrıları buluyorum.

Genellikle birden çok çağrı yok sayılır, ancak başka bir iş parçacığı başka bir dosya tanıtıcısını açarsa, genellikle daha önceki dosya tanıtıcıları alır ve kabus başlar.

İlgili konular