C++ 在迭代时向容器添加数据,并针对特定条件删除数据
我有一个向量,通过从外部调用函数指针(比如main())来添加数据。迭代过程将在向向量添加数据时开始,并将继续,直到发现向量为空。迭代过程还将在特定条件下从向量中删除数据。迭代时,数据将随机添加。我试图做的是,在主线程中运行迭代过程时,创建一个单独的线程来添加数据。但是我不能做到这一点,因为当循环执行时,添加过程没有发生。这里需要你的帮助。以下是我的代码:C++ 在迭代时向容器添加数据,并针对特定条件删除数据,c++,multithreading,C++,Multithreading,我有一个向量,通过从外部调用函数指针(比如main())来添加数据。迭代过程将在向向量添加数据时开始,并将继续,直到发现向量为空。迭代过程还将在特定条件下从向量中删除数据。迭代时,数据将随机添加。我试图做的是,在主线程中运行迭代过程时,创建一个单独的线程来添加数据。但是我不能做到这一点,因为当循环执行时,添加过程没有发生。这里需要你的帮助。以下是我的代码: ======= TASKMANAGER.HPP =============== #ifndef TASKMANAGER_H #define
======= TASKMANAGER.HPP ===============
#ifndef TASKMANAGER_H
#define TASKMANAGER_H
#include <vector>
#include <atomic>
#include <mutex>
#include <functional>
class TaskManager
{
public:
TaskManager();
void checkVec();
void addToVec(const int val);
std::function<void(int)> mValueAdder;
bool mStop;
private:
std::vector<int> mIntVec;
std::atomic_bool mChecking;
std::recursive_mutex mVecModifier;
size_t mVecSize;
};
#endif // TASKMANAGER_H
======== TASKMANAGER.CPP ==============
#include "taskmanager.h"
#include <thread>
#include <iostream>
#include <chrono>
using namespace std::literals::chrono_literals;
TaskManager::TaskManager() : mChecking(false), mStop(false), mVecSize(0)
{
mValueAdder = [this](const int val) -> void {
std::thread t(&TaskManager::addToVec, this, val);
if(t.joinable())
{
t.join();
}
if(this->mChecking == false)
{
std::cout << "Value of mChecking: " << mChecking << std::endl;
this->checkVec();
}
};
}
void TaskManager::checkVec()
{
mChecking = true;
do {
std::this_thread::sleep_for(1s);
std::cout << "checking" << std::endl;
uint16_t idx = 0;
while(idx < mVecSize)
{
std::cout << mIntVec[idx] << std::endl;
if(mIntVec[idx] == 1)
{
std::lock_guard<decltype(mVecModifier)> lock(mVecModifier);
mIntVec.erase(mIntVec.begin() + idx);
mVecSize--;
continue;
}
idx++;
}
} while(!mStop && (mChecking = !mIntVec.empty()));
}
void TaskManager::addToVec(const int val)
{
std::lock_guard<decltype(mVecModifier)> lock(mVecModifier);
mIntVec.push_back(val);
mVecSize++;
std::cout << "Val: " << val << " added to vector" << std::endl;
}
=======TASKMANAGER.HPP===============
#ifndef任务经理
#定义任务管理器
#包括
#包括
#包括
#包括
类任务管理器
{
公众:
TaskManager();
void checkVec();
void addToVec(const int val);
std::函数mValueAdder;
布尔mStop;
私人:
std::vector mIntVec;
std::原子检查;
std::recursive_mutex mVecModifier;
大小\u t mVecSize;
};
#endif//TASKMANAGER\u H
==========TASKMANAGER.CPP==============
#包括“taskmanager.h”
#包括
#包括
#包括
使用名称空间std::literals::chrono_literals;
TaskManager::TaskManager():mChecking(false)、mStop(false)、mVecSize(0)
{
mValueAdder=[this](const int val)->void{
std::thread t(&TaskManager::addToVec、this、val);
if(t.joinable())
{
t、 join();
}
如果(此->mChecking==false)
{
你的程序是有效的单线程(没有并发性)因为每次启动线程时,都会立即等待它完成。循环会删除1
s,并在向量为空时停止。向量只包含10
。循环何时终止?我添加该线程只是为了插入向量,插入完成后,它将终止,我只是想这样做同时向向量添加数据。循环将删除所有1s,并且只有当向量变为空时才会终止,另一个线程中运行的另一个进程(我在这里没有包括)将使向量的内容变为1I。谢谢,当该循环无限期运行时,我不知道如何随机插入数据。
#include <taskmanager.h>
using namespace std;
int main()
{
TaskManager tm;
tm.mValueAdder(10);
tm.mValueAdder(20);
tm.mStop = true;
return 0;
}
======== OUTPUT =========
Val: 10 added to vector
Value of mChecking: 0
checking
10
checking
10
checking
10
checking
10
....
....
That means, the value is not adding to the vector while the loop is running.