我的应用程序有一个类,该类具有使用 std::ofstream 写入文件的方法。
它是一个多线程应用程序,许多线程可以同时调用 log() 函数。因此,我在 log() 函数中添加了一个 std::lock_guard 互斥量。
这些线程也可以是 transient 的,这意味着它们不必与父进程一样长。
一旦文件大小达到最大配置值,就应该重命名和压缩。
文件大小可达 1GB。 gzip 需要 20 多秒来压缩它。
因此线程被阻塞,直到 gzip 完成压缩。
我正在寻找一种可以以非阻塞方式压缩文件的方法,同时保持 std::lock_guard guard(_log_mutex);记在心里。
class Logger {
std::string _logfile;
std::mutex _log_mutex;
uint64_t _sequence_number;
std::ofstream::pos_type _curr_size;
public:
void log (std::string message)
{
// Take the lock
std::lock_guard<std::mutex> guard(_log_mutex);
// If size exceeds max then close, rename, and compress.
if (_curr_size >= MAX_FILE_SIZE) {
_outputFile.close();
// Code already in place to rename the file.
// Compress _logfile ???
_outputFile.open(_logfile, std::ios::app);
_curr_size = _outputFile.tellp();
}
_outputFile << _sequence_number << " : " << message << std::endl;
_outputFile.flush();
_curr_size = _outputFile.tellp();
_sequence_number++;
}
// Other stuffs...
...
};
我尝试了以下但它仍然阻塞线程:
compress_file(const char *file_name) {
pid_t pid;
pid = fork();
if (!pid) {
execl("/usr/bin/gzip", "gzip", "-f", file_name, NULL);
exit(1);
} else {
while (wait3(NULL, WNOHANG, NULL) > 0) {
;
}
}
}
最佳答案
- 拿锁
- 关闭流
- 重命名文件
- 重新打开流
- 释放锁
- 在不阻止作者的情况下压缩重命名的文件
关于c++ - 如何以非阻塞方式压缩文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54523426/