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