繁体   English   中英

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

[英]Read a line from file using one thread and processing using another thread in C++ (Multi-threading)

线程新手。 我想有两个单独的线程来做两种不同的事情:

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()
    {
        // ?
    }

为了使分配有意义,一个线程应该读取新的输入行,而另一个线程正在处理先前读取的行。

要回答提出的问题,可以使用std :: async。 包含文件为<future>。 看到这近乎重复

我很想发布正确的程序。

编辑。 我无能为力。 就像很多事情一样,一旦被理解(并且您知道一些技巧),它就很简单。

警告扰流板警报上交作业后,才可以继续阅读(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;
}

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

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

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

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

构造完这些功能后,请解决在线程上运行功能的问题。 一般概念是,您将使用读取功能启动一个线程,并使用处理功能启动另一个线程。 然后,当它们完成自己正在做的事情时,您必须“加入”线程。

对于读取线程,它是直接的。 读取文件并将信息全部放入队列后,就完成了。 处理线程有点困难。 它需要弄清楚何时将要退出信息。 读取功能可能需要向队列添加一些内容以指示读取已完成。

有多种方法可以创建线程并在线程上运行函数。 我很确定您的老师会推荐这样做的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM