目的前提
对接自动化交易,多线程下写文件单,用ofstream追加写的时候,会出现写漏的情况,怀疑是多线程下,两个线程的文件光标位置一样了,导致有一个被覆盖了。
因为根据账号不同写不同的路径下的文件,所以想到根据账号不同加相应的锁。
实现
没有用文件锁。因为是ofstream,所以直接用了boost中的递归锁。
大概代码如下:
#include <boost/thread.hpp>
#include <map>
map<string, boost::recursive_mutex> s_fileorder_lock_map;
void writeFileOrder(const string &account, const string &orderstr)
{
try {
string filename = "order_signal.csv";
string fullpath = qmtfilepath + "/" + account + "/" + filename;
//根据账号设定互斥量 加锁
boost::recursive_mutex::scoped_lock lock(s_fileorder_lock_map[account]);
//LogTrace("s_lock_map,account:" << account <<", mutex:"<< &s_fileorder_lock_map[account]);
std::ofstream ofs(fullpath, std::ios_base::app);
ofs << orderstr;
ofs.close();
} catch (const exception &e) {
//LogError("exception occurred:" << e.what());
}
}
因为recursive_mutex不支持赋值等操作。 用一个map保存根据账号不同下的recursive_mutex互斥量正好,初次根据下标访问map获取value获取不到时,正好它给建立一个recursive_mutex。
结论
用在项目中,简单验证过, 目前是可用的。