Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从不同线程写入文件的正确方式(使用Qt c+;+;)_C++_Multithreading_Qt_Locking - Fatal编程技术网

C++ 从不同线程写入文件的正确方式(使用Qt c+;+;)

C++ 从不同线程写入文件的正确方式(使用Qt c+;+;),c++,multithreading,qt,locking,C++,Multithreading,Qt,Locking,我有一个创建线程的线程池,每个线程工作人员计算一些工作,以及工作何时完成 它将结果写入文件,每个工作线程只需要写入一个结果文件。 现在我的问题是,我如何保证在分配线程试图写入单个文件的情况下,不会有任何锁或丢失对文件的写入数据?对于这种情况,正确的策略是什么? mybe是否将所有结果保留在内存中?或者结果的变化 我已经在使用QThreadPool框架,我需要找到解决方案。 此外,如果从工作线程写入单个文件,我将不得不使用 单例文件管理器还是静态类,好主意吗?多线程应用程序 正如我所假设的,您将自

我有一个创建线程的线程池,每个线程工作人员计算一些工作,以及工作何时完成 它将结果写入文件,每个工作线程只需要写入一个结果文件。
现在我的问题是,我如何保证在分配线程试图写入单个文件的情况下,不会有任何锁或丢失对文件的写入数据?对于这种情况,正确的策略是什么?
mybe是否将所有结果保留在内存中?或者结果的变化

我已经在使用QThreadPool框架,我需要找到解决方案。
此外,如果从工作线程写入单个文件,我将不得不使用

单例文件管理器还是静态类,好主意吗?多线程应用程序

正如我所假设的,您将自己的
Runnable
,从
QRunnable

在构造
Runnable
类时,可以传递一些上下文信息。例如,您需要传递设备以写入,传递互斥锁以锁定设备

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;
};

因此,您有许多并发线程竞争一个共享资源。这需要某种类型的同步原语,例如

下面是(非Qt特定的)代码,展示了10个线程同时写入单个文件的情况。另一方面,C++11引入了很多好东西,比如
std::mutex
(还有
std::thread
,这样可以帮助消除一些特定于Qt的线程代码)

#包括
#包括
#包括
#包括
std::互斥m;
流文件的std::of;
int main(){
打开(“file.txt”);
病媒工作者;
对于(int i=0;i<10;++i){
workers.push_back(std::thread([=i]{
对于(int j=0;j<10;++j){
标准:锁和防护锁(m);

文件根据您的描述,信号量可能有帮助,可能有用您提供了什么解决方案?将结果保存在内存中?您可以创建自己的
Runnable
派生自
QRunnable
?写入完成后别忘了解锁互斥锁。@Pedro,
QMutexLocker
类似于
std::lock\u guard
。它在超出范围后解锁互斥锁。它实现RAII风格的锁定机制
#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;
}