
96
|
第三章
int feof_unlocked (FILE *stream);
int ferror_unlocked (FILE *stream);
int fileno_unlocked (FILE *stream);
void clearerr_unlocked (FILE *stream);
這些函式的行為如同它們的「會上鎖」的表親,但是它們不會檢查或取得
stream
的鎖。
如果需要上鎖,那麼程式設計者必須負責手動取得以及釋放串流的鎖。
委派
I/O
使用不會上鎖的標準 I/O 函式,在效能上可獲得相當的好處。此外,程式
碼不需要為了上鎖而擔心使用
flockfile()
所導致的複雜操作。設計應用
程式的時候,你可以試著把所有的 I/O 委派給單一執行緒(或把所有的
I/O 委派給一個執行緒集區;在該集區中,每個串流正好會被映射至一個
執行緒)。
雖然 POSIX 有替標準 I/O 函式定義了一些不會上鎖的變體,但是上面所列示的函式都不是
POSIX 定義的。它們全都是 Linux 特有的函式,不過各種其他的 Unix 系統支援其子集。
我們將會在第 7 章對執行緒做完整的探討。
標準 I/O 的缺陷
由於標準 I/O 被廣泛採用,一些專家指出了其中的缺陷。有些函式,例如
fgets()
,有時
會不敷使用。有些函式,例如
gets()
,太過可怕應該排除在標準之外。
標準 I/O 最大的問題在於效能受到兩次複製(double copy)的影響。讀取資料時,標準
I/O 會對核心進行
read()
系統呼叫,從核心複製資料到標準 ...