21xrx.com
2025-03-20 17:38:58 Thursday
文章检索 我的文章 写文章
C++多线程读写同一个文件的实现方法
2023-07-05 03:23:40 深夜i     --     --
C++ 多线程 读写 同一个文件 实现方法

在实际开发过程中,经常会遇到多个线程同时需要读/写同一个文件的场景。那么该如何实现多线程读写同一个文件呢?

一、锁机制

在多线程中,锁机制是最常用的一种同步机制。当一个线程访问共享资源(如文件、内存块等)时,可以使用锁机制来控制其他线程的访问。

在C++中,互斥量(mutex)是最常用的锁机制。使用互斥量可以保证同一时间只有一个线程能够进入被锁定的区域。

例如,我们可以通过以下代码实现多线程对同一个文件的读写:

#include <iostream>
#include <fstream>
#include <thread>
#include <mutex>
using namespace std;
mutex file_mutex; //定义互斥锁
//写入文件函数
void writeToFile(string msg)
{
  file_mutex.lock(); //加锁
  ofstream fout("data.txt", ios::app);
  fout << msg << endl;
  fout.close();
  file_mutex.unlock(); //解锁
}
//读取文件函数
void readFromFile()
{
  file_mutex.lock(); //加锁
  ifstream fin("data.txt");
  string line;
  while(getline(fin, line))
  
    cout << line << endl;
  
  fin.close();
  file_mutex.unlock(); //解锁
}
int main()
{
  //创建两个线程分别执行读写操作
  thread t1(writeToFile, "Hello");
  thread t2(readFromFile);
  t1.join(); //等待线程执行完毕
  t2.join();
  return 0;
}

以上代码中,我们首先定义了一个互斥锁`file_mutex`,然后在写入文件和读取文件的函数中使用`file_mutex.lock()`来加锁,使用`file_mutex.unlock()`来解锁。

二、文件指针

除了锁机制以外,我们还可以通过控制文件指针的位置来实现多线程对同一个文件的读写。

在C++中,可以通过`seekg`和`seekp`函数来控制文件指针的位置。其中,`seekg`用于读取文件时定位文件指针的位置,`seekp`用于写入文件时定位文件指针的位置。

例如,我们可以通过以下代码实现多线程对同一个文件的读写:

#include <iostream>
#include <fstream>
#include <thread>
using namespace std;
//写入文件函数
void writeToFile(string msg)
{
  fstream fout("data.txt", ios::app | ios::out);
  fout.seekp(0, ios::end); //将文件指针定位到文件末尾
  fout << msg << endl;
  fout.close();
}
//读取文件函数
void readFromFile()
{
  ifstream fin("data.txt");
  fin.seekg(0, ios::beg); //将文件指针定位到文件开头
  string line;
  while(getline(fin, line))
  
    cout << line << endl;
  
  fin.close();
}
int main()
{
  //创建两个线程分别执行读写操作
  thread t1(writeToFile, "Hello");
  thread t2(readFromFile);
  t1.join(); //等待线程执行完毕
  t2.join();
  return 0;
}

以上代码中,我们在写入文件时使用`fout.seekp(0, ios::end)`将文件指针定位到文件末尾,以保证不会覆盖原有内容。在读取文件时使用`fin.seekg(0, ios::beg)`将文件指针定位到文件开头,以便于读取文件内容。

总结

以上就是C++多线程读写同一个文件的实现方法。在实际开发中,我们可以根据实际情况选择不同的方法,以保证程序的可靠性和效率。

  
  

评论区