
94
|
第三章
標準 I/O 函式本來就具備
執行緒安全性
(
thread-safe
)。在內部,它們會關聯到一個鎖
(lock)、一個上鎖計數(lock count),而且每個已開啟串流會被關聯到一個擁有執行緒
(owning thread)。任何執行緒在發出任何 I/O 要求之前,必須先取得「鎖」,成為擁有
執行緒。兩個或多個執行緒操作相同的串流時,不能干擾標準 I/O 操作,因此在單一函
式呼叫的執行環境內,標準 I/O 操作是不可分割的。
當然,實務上,許多應用程式所需要的不可分割性大於個別函式呼叫的層次。舉例來
說,假設單一執行緒中有多個執行緒發出寫入要求。因為標準 I/O 函式具執行緒安全
性,個別的寫入操作將不會相互干擾而導致輸出混亂的結果。也就是,即使有兩個執行
緒同時發出寫入要求,上鎖機制將可確保其中一個寫入要求比另一個先完成。但如果行
程想要連續發出多個寫入要求,要如何讓另一個執行緒的寫入要求不但不會干擾到個別
的要求,也不會干擾到一整組的要求?為此,標準 I/O 程式庫提供了一系列的函式,可
用於個別操作與串流有關的鎖。
手動檔案上鎖
函式
flockfile()
會等到
stream
不再被鎖上,接著取得串流的鎖,提高上鎖計數,成為
串流的擁有執行緒,然後返回:
#include <stdio.h>
void flockfile (FILE *stream);
函式
funlockfile()
用於遞減與
stream
相對應的上鎖計數:
#include <stdio.h>
void funlockfile (FILE ...