Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中,使用一个线程从文件中读取一行,并使用另一个线程进行处理+;(多线程)_C++_Multithreading_File Io - Fatal编程技术网

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

C++ 在C+中,使用一个线程从文件中读取一行,并使用另一个线程进行处理+;(多线程),c++,multithreading,file-io,C++,Multithreading,File Io,新的线程。我希望有两个独立的线程来完成两件不同的事情: ThreadA:从输入文件中逐行读取文件 线程B:使用前面读过的行进行操作 我怎样才能做到这一点?提前谢谢 class A { //... public: void processFile(ifstream& input, string& s) { //read file line by line in ThreadA

新的线程。我希望有两个独立的线程来完成两件不同的事情:

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

线程B:使用前面读过的行进行操作

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

    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。包含文件是<;未来>。看这个

我很想发布一个正确的程序

编辑。我情不自禁。这就像很多事情一样,一旦被理解(并且你知道一些技巧),就很简单了

警告扰流板警报 在交作业之前,你(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;
}
intmain(){
std::ifstream输入(“foo.txt”);//或其他任何内容
使用std::string;
使用std::getline;
使用std::async;
使用std::move;
//处理该行的函数。。。
//请注意,“行”由值绑定。使用引用,
//(const string&line)将在线程之间创建冲突。
自动处理=[](常量字符串行)->bool{

return!!(std::cout线程是一个很难理解的概念

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

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

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

一旦构建了这些函数,就要解决在线程上运行函数的问题。一般的概念是,您将使用read函数启动一个线程,使用processing函数启动另一个线程。然后,当线程完成它们正在做的事情时,您必须“连接”线程

对于读取线程,它是直接的。一旦文件被读取,并且信息都在队列中,它就完成了。处理线程稍微困难一点。它需要确定信息何时会停止发送。读取函数可能需要向队列中添加一些内容,以指示阅读完毕


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

首先,我建议您花一些时间阅读您的问题,您知道吗?创建一个,将字符串作为参数传递给线程函数,然后添加将线程对象绑定到向量(以便以后可以
连接所有线程)?这是一个简单的解决方案。如果文件很大,那么你应该对线程池和工作队列进行一些研究。除了
std::thread
,如果你想得到一些结果,还应该阅读一些关于线程的内容。为什么?这没有好处。开始学习线程和锁。这是itI的措辞可能不正确,但是的。你是对的。继续当另一个线程正在处理以前读取的行时,e线程应该正在读取新的输入行。同样在while循环中,我忘了包括if(fin.eof())break;fin.eof()可能永远不会为true。(可能有人通过连接磁盘驱动器的电源线绊倒。)在这种情况下,程序循环将永远不会结束。编辑原始问题以准确反映作业内容,并显示您的最大努力。感谢您的输入。我已经编辑了问题。希望它更清楚一点。抱歉,我是新手,仍在学习。我只是对多线程感到困惑,无论有多少时间我反复阅读讲座和/或观看视频