使用unique_lock进行并发解析和过滤

时间:2015-10-18 07:24:06

标签: c++ multithreading c++11 concurrency mutex

我想阅读一个xml文档,过滤我不想要的任何内容(过滤不是问题的一部分),然后写回cout或ofstream。

但是,我想要同时执行此操作的方式如下:Thread1(解析器)读取xml文件,一次读取一行(我的代码中的std :: string行),然后将该行提供给thread2,其唯一的工作是过滤该行。完成后,它将该行提供回thread1,以写入输出。

但是,我现在的程序根本不安全。首先,有时thread2能够首先获取互斥锁,即使我执行std :: unique_lock locker(mu,defer_lock),甚至让thread2等待100 ms,我也会收到错误:std :: this_thread :: sleepfor(100毫秒)。我不确定如何确保首先通过thread1完成互斥锁的获取。

更重要的一个问题是,即使thread1首先获取了互斥锁,我在我的程序读取文档的第一行之后,在函数2的行locker.unlock()处收到错误。搜索此错误,似乎我可能正在尝试解锁已解锁的互斥锁。不应该在function2中初始化unique_lock来锁定互斥锁?

最后,我想我可能使用了错误的资源,或者我的程序结构错了。我可以提出一些改进代码的建议吗?

#include <iostream>
#include <string>
#include <fstream>
#include <thread>
#include <mutex>
#include <condition_variable>


std::mutex mu;
std::condition_variable cond;
bool checkThread1 = false;
bool checkThread2 = false;
std::string line;
bool checkIfEndOfFile = false;
//std::once_flag flag;


void function1()
{
std::ifstream in("example.xml");
std::unique_lock<std::mutex> locker(mu);
    while (getline(in, line))
    {
        locker.unlock();
        cond.notify_one();
        checkThread2 = !checkThread2;
        cond.wait(locker, []() {return checkThread1; });
    }
}

void function2()
{
std::string substring = "";
std::unique_lock<std::mutex> locker(mu);
cond.wait(locker, []() {return checkThread2; });
std::string tmp2 = "";
std::string tmp1;
for (int i = 0; i < line.length(); i++)
{
    // Filter
}
locker.unlock();
cond.notify_one();
checkThread1 = !checkThread1;
}


int main()
{
std::thread parser(function1);
std::thread filterer(function2);
parser.join();
filterer.join();
}

0 个答案:

没有答案