2013-05-03 59 views
2

锁定文件流,我一直锁定/使用像如何在不互斥

void Write_File(FILE* Input_File) 
{ 
     flockfile(Input_File); 
     Read_Stuff(); 
     funlock(Input_File); 
} 

东西,我想这些程序转换为使用流解锁在多线程应用程序的文件。我找不到类似的命令来使用流。有没有办法锁定文件流而不诉诸互斥?

+0

你只是试图阻止同一进程中的其他线程写入文件或“系统中的任何进程”?这些是明显不同的问题,解决方案非常不同(或根本不同,取决于系统的要求和体系结构)。 – 2013-05-03 20:12:35

+0

在输出之前是否真的锁定了输入文件? – jxh 2013-05-03 20:24:45

+0

@ user315052我实际上想读,我编辑代码来反映这一点。 – drcyber 2013-05-03 20:40:47

回答

1

您可以围绕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; 
+0

非常感谢代码.. – drcyber 2013-05-03 20:43:06

2

flockfile基本上一个互斥体,至少在glibc的,大概每隔平台以及。所以从某种意义上说,你已经“诉诸于互斥体”了。如果您更改为仅使用互斥锁,则不会改变任何内容(只要在文件上操作的所有代码路径只在持有互斥锁时执行)。

它不是迷惑flockfile(这是管理并发文件操作的单个进程的线程之间的互斥)基于系统的咨询文件锁定,如你与flockffcntl(F_SETLK)得到的是非常重要的。

+0

谢谢@Celada。这产生更整洁的代码。 – drcyber 2013-05-04 02:28:04