2010-12-04 11 views
10

Olası Çoğalt:
stdout thread-safe in C on Linux?Aynı anda çalışan iş parçacıklarında printf aramak için iş parçacığı güvenli mi?

Say thread1 ve benzeri ve işlerini ikisi de printf sonunda thread2 bulunmaktadır. İş parçacığı güvenli mi yoksa bir şekilde printf'i kilitlemek zorunda mı?

Stdout ile ilgili mi? Her bir printf sonra fflush (stdout) yaparsa ne olur? Bir şey değiştirir mi? karakterine yapmaktadır

+1

Bkz. Http://stackoverflow.com/questions/467938/stdout-thread-safe-in-c-on-linux – icecrime

cevap

11

POSIX.1 ve C-dil işlevleri şekilde uygulanmalıdır için POSIX.1c gerektirdiği ( tipi FILE nesnelere işaretçiler ile temsil edilen) akışları Evreselliğin elde edilir (bkz. ISO/IEC 9945: 1-1996, §8.2).

Thread-safety and POSIX.1

Not bakınız: Bazı fonksiyonlar onların argümanları bağlı olarak evresel veya evresel olmayan olabilir.

+8

Bu işlevler * değil * reentrant. Onlar diş güvenli. Büyük bir fark var. Kurallara uygun işlevler otomatik olarak iş parçacığı için güvenlidir, ancak iş parçacığı ile ilgili işlevler yine de çalıştıkları aynı iş parçacığından (örneğin, bir sinyal işleyicisinden) çağrılırsa kilitlenebilir (veya daha kötüsü). –

+0

Bazı referanslar: http://www.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html ve http://www.opengroup.org/onlinepubs/9699919799/functions/flockfile.html özellikle bkz. ikincisi: "(FILE *") nesnelerini referans alan tüm işlevler, bunların ('FILE *') nesnelerinin sahipliğini elde etmek için dahili olarak 'flockfile()' ve 'funlockfile()' kullanıyormuş gibi davranır. –

+0

Posix, iplik güvenliği, reentrancy ve async signal safe arasında farklılık gösterir. DOSYA * işlevleri asenkron sinyali güvenli değildir. – nos

İlgili konular