簡體   English   中英

如果所有線程都寫入不同的位置,多個線程可以同時寫入文件嗎?

[英]Can multiple threads write into a file simultaneously, if all the threads are writing to different locations?

我用c ++編寫代碼。 我可以遇到任何種類的競爭條件或錯誤嗎?

從底層系統的角度來看這是沒有問題的(對於我所知道的所有系統)。 但是,通常需要具有完全獨立的文件描述符/句柄。 這是因為文件描述符維護狀態,例如當前文件位置。

您還需要檢查特定C ++接口與您正在使用的文件系統的線程安全性。 除了底層文件系統的線程安全性之外,還需要這樣做。

您還應該考慮線程I / O可能會變慢的可能性。 系統可能必須序列化對總線的訪問。 您可以通過重疊I / O或通過生產者/消費者管道提供的專用I / O線程獲得更好的性能。

另一種解決方案,取決於文件的大小和運行的系統,是使用內存映射文件 ,即。 將文件映射到虛擬內存。 這將使您可以直接訪問該文件,就好像它是一塊內存。 這樣,任意數量的線程都可以簡單地寫入內存區域,后續調用將映射刷新到磁盤(取決於內存映射的配置)將只是將數據存儲在磁盤上。

請注意,由於32位平台上的限制,您將無法映射大於2-3 GB的任何文件,具體取決於架構和可用於執行虛擬內存的實際位數。 大多數64位系統有48位或更多可用於此任務,允許您映射至少256 TB,我認為這是綽綽有余。

這取決於。 文件不是它們的句柄,流不是文件。 這三個不同的概念必須清楚。

現在,操作系統可以多次打開文件,返回不同的句柄,每個句柄都有自己的“位置指針”。 如果文件以“共享模式”打開以進行讀取和寫入,則可以根據需要查找所需的句柄和讀/寫。 你沒有覆蓋的事實取決於你。 系統為整個文件或部分文件授予操作的順序(但需要有關操作系統的更多信息)

如果每個句柄都附加到不同的流,則每個流將獨立於另一個流寫入。 但是 - 在這種情況下 - 存在“緩沖”的復雜性(寫入可以延遲並且可以預期讀取:並且可以比您要求的更長:確保通過適當的刷新來正確管理最終重疊)

你當然可以。 根據您編寫實際代碼的方式(即使用該文件),可能會出現競爭條件。 此外,如果IO被緩沖,如果緩沖區域重疊,則可能會出現奇怪的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM