Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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++_Multithreading - Fatal编程技术网

C++ 在迭代时向容器添加数据,并针对特定条件删除数据

C++ 在迭代时向容器添加数据,并针对特定条件删除数据,c++,multithreading,C++,Multithreading,我有一个向量,通过从外部调用函数指针(比如main())来添加数据。迭代过程将在向向量添加数据时开始,并将继续,直到发现向量为空。迭代过程还将在特定条件下从向量中删除数据。迭代时,数据将随机添加。我试图做的是,在主线程中运行迭代过程时,创建一个单独的线程来添加数据。但是我不能做到这一点,因为当循环执行时,添加过程没有发生。这里需要你的帮助。以下是我的代码: ======= TASKMANAGER.HPP =============== #ifndef TASKMANAGER_H #define

我有一个向量,通过从外部调用函数指针(比如main())来添加数据。迭代过程将在向向量添加数据时开始,并将继续,直到发现向量为空。迭代过程还将在特定条件下从向量中删除数据。迭代时,数据将随机添加。我试图做的是,在主线程中运行迭代过程时,创建一个单独的线程来添加数据。但是我不能做到这一点,因为当循环执行时,添加过程没有发生。这里需要你的帮助。以下是我的代码:

======= 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.