c++ - 如何以非阻塞方式压缩文件

标签 c++ file compression

我的应用程序有一个类,该类具有使用 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/

相关文章:

c++ - Box2D 无法设置密度

c++ - 为什么这个简短的比较没有按我预期的方式优化?

c - 链接文件而不是链接列表

css - css 压缩在 Firefox 和 Iphone safari 中不起作用

iphone - iOS从网络获取压缩图像

c++ - 编辑并继续使用 C++?最好使用 Code::Blocks?

java - 如何从文件内容创建 Java 字符串?

python - 如何获取最新的文件

CSS 整洁配置

c++ - strstream 和 stringstream 的区别