为什么在使用for和while循环的两个线程之间无法解决锁定条件

我是一个完整的线程初学者,因此我自己无法解决此问题。

我有两个应该并行运行的线程。第一个线程应读入数据(模拟接收队列线程),一旦数据准备就绪,第二个线程应处理(处理线程)数据。问题在于,第二个线程将无限期地等待条件变量的更改。 如果删除第一个线程的for循环,则条件变量将通知第二个线程,但该线程仅执行一次。如果在for循环中使用了条件变量,为什么没有通知条件变量?

我的目标是在第一个线程中读取CSV文件的所有数据,并根据第二个线程中向量中的行内容将其存储。

线程看起来像这样

std::mutex mtx;
std::condition_variable condVar;
bool event_angekommen{false};

void simulate_event_readin(CSVLeser leser,int sekunden,std::vector<std::string> &csv_reihe)
{
    std::lock_guard<std::mutex> lck(mtx);
    std::vector<std::vector<std::string>> csv_daten = leser.erhalteDatenobj();
    for (size_t idx = 1; idx < csv_daten.size(); idx++)
    {
        std::this_thread::sleep_for(std::chrono::seconds(sekunden));
        csv_reihe = csv_daten[idx];
        event_angekommen = true;
        condVar.notify_one();
    }
}

第二个线程看起来像这样:

void detektiere_events(Detektion detektion,std::vector<std::string> &csv_reihe,std::vector<std::string> &pir_events)
{
    while(1)
    {
        std::cout<<"Warte"<<std::endl;
        std::unique_lock<std::mutex> lck(mtx);
        condVar.wait(lck,[] {return event_angekommen; });
        std::cout<<"Detektiere Events"<<std::endl;
        std::string externes_event_user_id = csv_reihe[4];
        std::string externes_event_data = csv_reihe[6];
        detektion.neues_event(externes_event_data,externes_event_user_id);
        if(detektion.pruefe_Pir_id() == true)
        {
            pir_events.push_back(externes_event_data);
        };
    }
}

我的主要角色如下:

int main(void)
{
Detektion detektion;
CSVLeser leser("../../Example Data/collectedData_Protocol1.csv",";");

std::vector<std::string> csv_reihe;
std::vector<std::string> pir_values = {"28161","28211","28261","28461","285612"};
std::vector<std::string> pir_events;

std::thread thread[2];

thread[0] = std::thread(simulate_event_readin,leser,4,std::ref(csv_reihe));
thread[1] = std::thread(detektiere_events,detektion,std::ref(csv_reihe),std::ref(pir_events));

thread[0].join();
thread[1].join();

}
hyk123456789 回答:为什么在使用for和while循环的两个线程之间无法解决锁定条件

我不是C ++专家,但是代码似乎足以理解该问题。

您的线程1抓住一次锁,直到其生命周期结束才释放它。它可能表示已满足该条件,但实际上它从未释放锁以允许其他线程执行操作。

要解决此问题,请在休眠后将std::lock_guard<std::mutex> lck(mtx); 放入循环中。这样,线程将在每次迭代时获取并释放锁,从而使另一个线程有机会在睡眠时采取行动。

本文链接:https://www.f2er.com/2619719.html

大家都在问