簡體   English   中英

從不同線程寫入文件的正確方法(使用Qt c ++)

[英]right way to write to file from different threads (using Qt c++ )

我有創建線程的線程池,每個線程工作人員都要計算一些工作,完成后它將結果寫入文件,每個工作線程都需要向其中寫入一個結果文件。
現在我的問題是我如何保證不會有任何鎖或丟失向試圖分配到單個文件的線程分配的文件寫入數據? 這種情況下正確的策略是什么?
我要把所有結果保存在內存中嗎? 或結果

我已經使用了QThreadPool框架,我需要用它找到解決方案。
我也徘徊,確實從工作線程寫入單個文件,我將不得不使用
單例文件管理器或靜態類,這是個好主意嗎? 對於多線程應用程序?

因此,您有許多並發線程爭用一種共享資源。 這就產生了某種同步原語,例如互斥體

下面的代碼(非Qt專用)展示了10個線程同時寫入一個文件。 附帶說明一下,C ++ 11引入了很多好東西,例如std::mutex (也包括std::thread ,因此可以幫助消除某些Qt特定的線程代碼)。

#include <fstream>   
#include <mutex>
#include <thread>    
#include <vector>

std::mutex m;
std::ofstream file;

int main() {
  file.open("file.txt");

  std::vector<std::thread> workers;
  for (int i = 0; i < 10; ++i) {       
    workers.push_back(std::thread([=i] {
      for (int j = 0; j < 10; ++j) {
        std::lock_guard<std::mutex> lock(m);
        file << "thread " << i << ": " << j << endl;
      }
    }));
  }
  for (auto& worker : workers) {
    worker.join();
  }

  file.close();
  return 0;
}

當然,如果代碼中有很多地方可以訪問共享資源,則最好將它與互斥鎖一起封裝在一些“訪問器”類中,該類可以管理對資源的所有狀態修改調用。

PS如果您不在C ++ 11編譯器上,則可以使用boost::mutex或Qt特定的互斥體包裝器。 關鍵是您需要一些與共享資源關聯的同步原語。

正如我所假設的,您創建了自己的Runnable ,它源自QRunnable

在構造Runnable類時,您可以傳遞一些上下文信息。 例如,您需要傳遞設備以寫入並mutex以鎖定設備。

class Runnable: public QRunnable
{
public:
    Runnable(QIOdevice* device, QMutex* mutex):_d(device), _m(mutex){}
    void run()
    {
        saveInFile();
    }

private:
    void saveInFile()
    {
        QMutexLocker lock(_m);
        //now only one thread can write to file in the same moment of time
        device->write(...);
    }

    QIOdevice* _d;
    QMutex* _m;
};

暫無
暫無

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

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