多线程存储到文件中

时间:2019-06-06 15:22:17

标签: c++ multithreading

我有验证码

const int N = 100000000;
int main() {
    FILE* fp = fopen("result.txt", "w");
    for (int i=0; i<N; ++i) {
        int res = f(i);
        fprintf (fp, "%d\t%d\n", i, res);
    }
    return 0;
}

这里f在单线程中平均运行几毫秒。

为了使其更快,我想使用多线程。

  1. 什么提供​​了获取下一个i的方法?还是我需要锁定,获取,添加和解锁?
  2. 是否应该在单独的线程中进行编写以简化工作?
  3. 如果需要在f(7)之前解决f(3),我是否需要一个临时存储器?
  4. 如果为3,很可能长时间未计算f(3)且临时存储器已满?

我当前正在使用C ++ 11,但是可以要求使用更高版本的C ++

1 个答案:

答案 0 :(得分:0)

一般规则如何提高性能:

  1. 查找性能的方法(自动测试)
  2. 对现有代码进行性能分析(发现瓶颈)
  3. 了解第2点中的发现,并尝试修正它们(不致残害)
  4. 1.点开始进行测量,并确定更改是否提供了预期的改进。
  5. 回到点2次
  6. 仅如果步骤1至5不能帮助尝试使用多线程。步骤与第2-5点相同,但您必须考虑:您可以将大型任务拆分为几个较小的任务吗?如果是,他们是否需要同步?你可以避免吗?

现在在您的示例中,只需将结果拆分为8个(或更多)单独的文件,并在需要时最后将它们合并。

这看起来像这样:

#include <vector>
#include <future>
#include <fstream>

std::vector<int> multi_f(int start, int stop)
{
    std::vector<int> r;
    r.reserve(stop - start);
    for (;start < stop; ++start) r.push_back(f(start));
    return r;
}


int main()
{
    const int N = 100000000;
    const int tasks = 100;
    const int sampleCount = N / tasks;

    std::vector<std::future<std::vector<int>>> allResults;
    for (int i=0; i < N; i += sampleCount) {
        allResults.push_back(std::async(&multi_f, i, i + sampleCount));
    }

    std::ofstream f{ "result.txt" }; // it is a myth that printf is faster
    int i = 0;
    for (auto& task : allResults)
    {
        for (auto r : task.get()) {
            f << i++ << '\t' << r << '\n';
        }
    }

    return 0;
}