锁定文件流,我一直锁定/使用像如何在不互斥
void Write_File(FILE* Input_File)
{
flockfile(Input_File);
Read_Stuff();
funlock(Input_File);
}
东西,我想这些程序转换为使用流解锁在多线程应用程序的文件。我找不到类似的命令来使用流。有没有办法锁定文件流而不诉诸互斥?
锁定文件流,我一直锁定/使用像如何在不互斥
void Write_File(FILE* Input_File)
{
flockfile(Input_File);
Read_Stuff();
funlock(Input_File);
}
东西,我想这些程序转换为使用流解锁在多线程应用程序的文件。我找不到类似的命令来使用流。有没有办法锁定文件流而不诉诸互斥?
您可以围绕C++ I/O流式样界面包装C风格的流。下面的例子为您提供了一个如何使用ostringstream
实现一个想法:
class lockedostream_impl : public std::ostringstream
{
friend class lockedostream;
struct buf_t : public std::stringbuf {
FILE *f_;
buf_t (FILE *f) : f_(f) { flockfile(f_); }
~buf_t() { funlockfile(f_); }
int sync() {
int r = (f_ ? -(fputs(str().c_str(), f_) == EOF) : 0);
str(std::string());
return r;
}
} buf_;
std::ostream & os() { return *this; }
lockedostream_impl (FILE *f) : buf_(f) { os().rdbuf(&buf_); }
};
class lockedostream {
typedef std::ostream & (*manip_t) (std::ostream &);
mutable lockedostream_impl impl_;
public:
lockedostream (FILE *f) : impl_(f) {}
template <typename T>
const lockedostream & operator << (const T &t) const {
impl_.os() << t;
return *this;
}
const lockedostream & operator << (manip_t m) const {
impl_.os() << m;
return *this;
}
};
您可以更改锁定原始不过你想要的,但我保持你的使用flockfile()
和funlockfile()
愿望。有了这个,你可以写代码是这样的:
lockedostream(f)
<< some_stuff_to_be_written
<< some_other_stuff
<< std::endl;
非常感谢代码.. – drcyber 2013-05-03 20:43:06
flockfile
基本上是一个互斥体,至少在glibc的,大概每隔平台以及。所以从某种意义上说,你已经“诉诸于互斥体”了。如果您更改为仅使用互斥锁,则不会改变任何内容(只要在文件上操作的所有代码路径只在持有互斥锁时执行)。
它不是迷惑flockfile
(这是管理并发文件操作的单个进程的线程之间的互斥)基于系统的咨询文件锁定,如你与flockf
或fcntl(F_SETLK)
得到的是非常重要的。
谢谢@Celada。这产生更整洁的代码。 – drcyber 2013-05-04 02:28:04
你只是试图阻止同一进程中的其他线程写入文件或“系统中的任何进程”?这些是明显不同的问题,解决方案非常不同(或根本不同,取决于系统的要求和体系结构)。 – 2013-05-03 20:12:35
在输出之前是否真的锁定了输入文件? – jxh 2013-05-03 20:24:45
@ user315052我实际上想读,我编辑代码来反映这一点。 – drcyber 2013-05-03 20:40:47