2012-11-25 28 views
29

putStrLn numaralı çağıran birden fazla iş parçacığım varsa, herhangi bir eşzamanlılık denetimi olmadan iş parçacıklarının çıktısının araya girebileceğini biliyorum.putStrLn iş parçacığı güvenli midir?

Sorunuz putStrLn iş parçacığı bu çıkışlı iş parçacığı mıdır?

putStrLn arabelleğe alınmış bir yazma işlemi olduğunu farz ediyorum, bu nedenle, iki iş parçacığının aynı anda putStrLn numaralı aramasını çağırarak, çıktı arabelleğindeki herhangi bir bozulmanın ortaya çıkıp çıkmayacağını sorun.

Ve genel olarak, Haskell'in (gerçekten GHC'ler) diğer "standart I/O" işlevlerinin iplik güvenliği hakkında neler söylenebilir? Özellikle, tamponlanmış okuma işlemlerinden herhangi biri için aynı karakterin aynı anda aynı okuma çağrısı yapan iki farklı dişe geri dönmesi mümkün mü?

+0

Stdout çıktısı iş parçacığı güvenli olmayan bir kütüphaneyi (sanırım her zamanki C/C++ çalışma zamanlarını, C#, Java vb.) Düşündüğümü sanmıyorum. Tahmin et, benim de burada sorun yok diyorum. +1 iyi bir soru olsa da. – Mehrdad

+0

Linux 'putStrLn' ve arkadaşları [' write'] (http://linux.die.net/man/2/write) ve ['select'] (http://linux.die.net/man) aracılığıyla uygulandı./2/select) sabit uzunlukta bloklar için çift (satır veya blok tamponlama ile), yani soru 'yazma'ın iplik güvenli olup olmadığıdır. POSIX, 'write' için (1003.1-2001: 2.9.1 & 2.9.7) iş parçacığı güvenliği gerektirir ve genellikle budur. – JJJ

+0

Ve 'MVar' kilitleri [' futex'] ile uygulandı (http://linux.die.net/man/4/futex) ('threaded' çalışma zamanı ile). @ Shachaf cevabı doğrudur. – JJJ

cevap

28

Evet, bu sizin sorduğunuz anlamda iş parçacığı için güvenli. Handle, arabelleğin bozulmasına izin vermeyecek bir MVar tarafından korunmaktadır. Gösterdiğiniz gibi, serpiştirmek farklı bir konudur.

İlgili konular