//在实际工作中,常常遇到多线程读写同一文件的问题。
//如果读写的ini文件,本文能给你帮助。
//本文在c++ builder 10.3 平台调试通过。
#include <iostream> // std::cout
#include <thread> // std::thread
#include <mutex> // std::mutex
#include <fstream>
#include <inifiles.hpp>
volatile int counter(0); // 定义一个全局变量,当做计数器用于累加
std::mutex mtx; // 用于保护counter的互斥锁
using namespace std;
void writeCoordinate()
{ while (counter<10)//退出循环条件,counter=10 ,根据情况改条件
{
mtx.lock(); //互斥锁上锁
TIniFile *pIni = new TIniFile("d:\\test2.ini");//
pIni->WriteString("坐标","x","1");
pIni->WriteString("坐标","y","1");
pIni->WriteString("坐标","z","1");
TDateTime dt=Now();
unsigned short year,month,day;
unsigned short hour,min,sec,msec;
dt.DecodeDate(&year,&month,&day);
dt.DecodeTime(&hour, &min,&sec, &msec);
char time[50];
sprintf(time,"%d.%d.%d %d:%d:%d %d",year,month,day,hour,min,sec,msec);
pIni->WriteString("坐标","time",time);
counter++;
delete pIni;
mtx.unlock(); //互斥锁解锁
}
}
void readCoordinate()
{
while (counter<10) //退出循环条件,counter=10,根据情况改条件
{
mtx.lock(); //互斥锁上锁
TIniFile *pIni = new TIniFile("d:\\test2.ini");//
AnsiString x,y,z,time;
x=pIni->ReadString("坐标","x","未知");
y=pIni->ReadString("坐标","y","未知");
z=pIni->ReadString("坐标","z","未知");
time=pIni->ReadString("坐标","time","未知");
cout<<counter<<endl;
cout<<x<<endl;
cout<<y<<endl;
cout<<z<<endl;
cout<<time<<endl;
cout<<"---"<<endl;
delete pIni;
mtx.unlock(); //互斥锁解锁
}
}
int _tmain(int argc, _TCHAR* argv[])
{
const int num=1;//写线程数量,可大于1
std::thread threads[num];//线程数组
std::thread thread1;//读线程,写可改成数组,
for (int i = 0; i < num; ++i)
threads[i] = std::thread(writeCoordinate); //启动线程
thread1 = std::thread(readCoordinate); //启动1个线程
for (auto& th : threads) th.join(); //等待10个线程结束
thread1.join();
system("pause");
return 0;
}