【发布时间】:2012-10-05 01:44:30
【问题描述】:
在 C++ 中,有没有办法在以下情况下使写入文件线程安全?
void foo_one(){
lock(mutex1);
//open file abc.txt
//write into file
//close file
unlock(mutex1);
}
void foo_two(){
lock(mutex2);
//open file abc.txt
//write into file
//close file
unlock(mutex2);
}
在我的应用程序(多线程)中,foo_one() 和 foo_two() 很可能同时由两个不同的线程执行。 有什么方法可以使上述线程安全吗?
我考虑过使用文件锁( fcntl 和/或 lockf ),但不确定如何使用它们,因为 fopen() 已在应用程序中使用(性能原因),并且在某处说明这些文件锁应该不能与 fopen 一起使用(因为它是缓冲的)
PS : 函数 foo_one() 和 foo_two() 位于两个不同的类中,它们之间无法共享数据:( 遗憾的是,设计使得一个函数不能调用另一个函数。
【问题讨论】:
-
是的。您只需要一个代表文件的锁(称为 mutex3)。 PS。如果您正在编写 C++ 代码,您应该使用 RAII 来锁定/解锁这些互斥锁。
-
@LokiAstari 函数 foo_one() 和 foo_two() 位于两个不同的类中,它们之间无法共享资源:( 遗憾的是,设计使得一个函数不能调用其他函数。
-
可以只创建一个类的“Write”函数,在它自己的线程上调用它。只是循环直到它退出。然后每次你需要写东西到文件时,你可以把它推到向量中,让那个线程在它到达后立即将它写到文件中。
标签: c++ multithreading file logging