从不同的线程,不同的函数写入(记录)到同一个文件?

k0n*_*3ru 5 c++ logging multithreading file

在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);
}
Run Code Online (Sandbox Code Playgroud)

在我的应用程序(多线程)中,foo_one()和foo_two()很可能同时由两个不同的线程执行.有没有办法让上面的线程安全?

我考虑过使用文件锁(fcntl和/或lockf),但不确定如何使用它们,因为fopen()已经在应用程序中使用(性能原因),并且在某些地方声明不应该使用这些文件锁与fopen(因为它被缓冲)

PS:函数foo_one()和foo_two()在两个不同的类中,并且没有办法在它们之间有共享数据:(可遗憾的是,设计是这样的,一个函数不能调用其他函数.

Mar*_*ork 8

添加记录功能.
这两个函数都调用日志记录功能(执行适当的锁定).

mutex  logMutex;
void log(std::string const& msg)
{
    RAIILock  lock(logMutex);

    // open("abc.txt");
    // write msg
    // close
}
Run Code Online (Sandbox Code Playgroud)


wal*_*lyk 1

foo_one()如果函数和的本质foo_two()只是打开文件,向其中写入一些内容,然后关闭它,那么使用相同的互斥体来防止它们互相混乱:

void foo_one(){
  lock(foo_mutex);
  //open file abc.txt
  //write into file
  //close file
  unlock(foo_mutex);
}

void foo_two(){
  lock(foo_mutex);
  //open file abc.txt
  //write into file
  //close file
  unlock(foo_mutex);
}
Run Code Online (Sandbox Code Playgroud)

当然,这是假设这些是唯一的作家。如果其他线程或进程写入该文件,锁定文件可能是个好主意。