[英]Is the value of a Linux file descriptor always smaller than the open file limits?
[英]Linux open() file descriptor
如果我在不同的線程中多次打開同一文件(.txt文件),則返回的文件描述符將有所不同。 如果我嘗試使用文件描述符進行write(),那么自從多個線程嘗試寫入同一文件以來,寫入功能的任何機會都被阻止了嗎?
我擔心的是,當一個線程調用寫入單個文件時,另一個線程調用也寫入同一文件時。 那么,第二個線程的寫入是否將等待第一個線程的寫入首先完成? 如果是這樣,我如何確保第二個寫調用不會等待,並且如果有第一個寫會立即返回,因為我不想等待第二個線程的寫。
謝謝
如果您有多個線程共享同一個資源(在您的情況下是文件),則您有責任使用某種同步方式(例如,信號量或互斥量)以確保在任何時候僅進行一次寫操作。 否則,結果將是不確定的。 Unix不會為您跟蹤此情況-如果在另一個線程中進行同一文件的寫入時開始在一個線程中進行寫入,則不會發生阻塞。 寫入將立即完成,而不能保證對底層物理設備的I / O操作的順序-甚至可以交錯。
無論使用進程還是線程,除非非常仔細地進行操作,否則同時寫入同一文件都可能會引起問題。
文件描述符的編號是否相同並不重要。
寫入磁盤文件時,write()通常不會阻塞,因為所做的更改只會進入操作系統緩存。 有多少任務在執行此操作都沒有關系。
但是,如果您從多個進程中寫入文件,則最終可能會在文件中產生垃圾,因為寫入的順序是不確定的。
如果要在多個線程中寫入同一文件的不同部分 ,則可以使用pwrite()寫入文件中的特定位置,並且多個線程可以共享同一文件描述符。 如果您的線程做對了,那沒關系。
此技術通常不適用於文本文件。 文本文件通常只需一次寫入一個線程即可獲得可預測的內容。
您可以在寫入模式下打開文件(在這種情況下,寫入可能會相互破壞),也可以在追加模式下打開文件(在這種情況下,操作系統將鎖定並確保每次寫入原子地完成,以后再進行寫入-來自任何線程-定向到文件的新結尾)。
因此,請使用追加模式。 您的線程將迅速將數據移入內核隊列(假設您正在刷新),然后開始進行工作。 如果您發現速度還不夠快,則可以嘗試將數據從單個線程移到專用於執行文件更新的線程中,但先獲得一個使用更簡單,更干凈的實現的工作系統,然后再進行分析。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.