Динамический массив из временных элементов на основе потоков (std::thread)

Рейтинг: 0Ответов: 1Опубликовано: 26.04.2023

Мне нужно создать динамический массив, при добавлении в который, элементы запускают отдельные потоки. По завершении этих потоков элементы из массива автоматически удаляются. Я новичок в с++, прошу помочь с этой задачкой. Вот код, иллюстрирующий должный результат.

Вывод:

  • [0] Hello, world
  • [1] Hello, world
  • [2] Hello, world
  • [2] Hello, world
  • [0] Hello, world
  • [1] Hello, world
  • [2] Hello, world

И т.д.

#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
#include <vector>
using namespace std;

mutex mtx;

int generateID()
{
    static int s_id{ -1 };
    return ++s_id;
}

void print(int id) // нагрузка для потока
{
    for (int i{ 0 }; i != 5; ++i) {
        this_thread::sleep_for(chrono::milliseconds(500));
        mtx.lock();
        cout << "["<< id << "] " << "Hello, world" << endl;
        mtx.unlock();
    }
}

class foo // класс, при создании объекта которого создается поток
{
    int m_id{ generateID() };
    vector<thread>& m_ths;
public:
    foo(vector<thread>& ths) : m_ths(ths)
    {
        m_ths.push_back(thread(print, m_id));
    }
    ~foo()
    {
        m_ths.at(m_id).join();
    }
};

class Operator // возможное решение, через класс (тоже устроит)
{
    vector<thread>& m_ths;
public:
    Operator(vector<thread>& ths)
        : m_ths(ths)
    {}
    void push()
    {
        foo a(m_ths);
    }
};

int main()
{
    vector<thread> ths;
    vector<foo> fs;

    foo a(ths);
    foo b(ths);
    foo c(ths);

    /*Operator op(ths);
    op.push();
    op.push();*/
    
    return 0;
}

Ответы

▲ 0

Решил проблему, при помощи функции-члена mJoin(), в классе foo

class foo
{
    int m_id{ generateID() };
    vector<thread>& m_ths;
public:
    foo(vector<thread>& ths) : m_ths(ths)
    {
        m_ths.push_back(thread(print, m_id));
    }
    void mJoin()
    {
        m_ths.at(m_id).join();
    }
};

int main()
{
    vector<thread> ths;
    vector<foo> fs;

    fs.push_back(ths);
    fs.push_back(ths);
    fs.push_back(ths);

    for (auto& f : fs) f.mJoin();


    return 0;
}