使用一个线程从文件中读取一行并使用C ++中的另一个线程进行处理(多线程)

时间:2017-11-26 05:20:14

标签: c++ multithreading file-io

线程新手。我想有两个单独的线程做两件事:

ThreadA:从输入文件中逐行读取文件

ThreadB:使用之前读过的行做事

我怎样才能做到这一点?提前致谢

    class A
    {
    //...
    public:
        void processFile(ifstream& input, string& s)
        {
            //read file line by line in ThreadA
            //process that line in ThreadB
        }
    };

    int main()
    {
        // ?
    }

2 个答案:

答案 0 :(得分:-1)

对于有意义的赋值,一个线程应该读取新的输入行,而另一个线程正在处理先前读取的行。

要回答提出的问题,可以使用std :: async。包含文件是< future>。请参阅此near-duplicate

我很想发布一个正确的节目。

EDIT。我无法自拔。就像许多事情一样,这一点很容易理解(你知道一些技巧)。

警告掠夺者警告 在您完成作业之前,您(OP)不应该继续阅读。

int main() {
    std::ifstream input("foo.txt"); // Or whatever

    using std::string;
    using std::getline;
    using std::async;
    using std::move;

    // The function that processes the line ...
    // Notice that "line" is bound by value. Using a reference,
    // (const string &line) would create a conflict between threads.
    auto process = [](const string line)->bool {
        return !!(std::cout << line << std::endl); // or whatever...
    };

    string line;
    // The bang-bang !! turns the result of getline into bool
    bool line_ready = !!getline(input, line); // Read first line
    bool process_ok = true;
    while (line_ready && process_ok) {
        auto handle = async(std::launch::async, process, move(line)); // Launch thread
        line_ready = !!getline(input, line); // Fetch next line while processing previous
        process_ok = handle.get(); // Wait for processing to finish
    }
    return (process_ok && input.eof()) ? 0: -1;
}

答案 1 :(得分:-1)

线程是一个难以理解的概念。

从概念上讲,线程提供并行执行路径,这些路径似乎是并发执行的。在多核处理器上,它们实际上可能同时运行。在单核处理器上,它们实际上并不是同时运行,但它们似乎是。

要有效地使用多线程,您必须能够以一种可以想象同时运行两个函数将使您受益的方式来解决问题。在您的情况下,您希望在一个函数中读取信息,同时在另一个完全独立的函数中处理信息。一旦你看到如何做到这一点,你只需要在不同的线程上运行这些函数,并弄清楚如何从一个函数安全地获取信息。

我建议编写一个从文件中读取的函数,并将信息存储在某种队列或缓冲区中。编写另一个从缓冲区或队列中获取信息并处理信息的函数。遵守read函数只写入队列的规则,处理函数只从队列中读取。

构建完这些函数后,解决在线程上运行函数的问题。一般的概念是,您将启动具有读取功能的线程,以及具有处理功能的另一个线程。然后你必须加入&#39;当他们完成他们正在做的事情时的线程。

对于读取线程,它是直截了当的。一旦读取了文件,并且信息全部在队列中,就完成了。处理线程有点困难。它需要弄清楚信息什么时候会退出。读取函数可能需要向队列添加一些内容以指示读取已完成。

有许多方法可以创建线程并在线程上运行函数。我很确定你的导师正在推荐这样做的方法。