Я начинаю с разработки потокобезопасной структуры данных и пытаюсь реализовать параллельный вектор, который скрывает для пользователя сложность многопоточности и предлагает поточно-безопасную функцию очистки (которую не предлагает Intel TBB::ConcurrentVector). Учитывая параллельный вектор, основанный на std::vector и блокирующий мьютекс для каждого вызова функций очистки или push_back std::vector, как безопасно перебирать поток через параллельный вектор, используя цикл for? другими словами, как сделать iterate_thread в этом минимально воспроизводимом примере потокобезопасным?
Я начинаю с разработки потокобезопасной структуры данных и пытаюсь реализовать параллельный вектор, который скрывает для пользователя сложность многопоточности и предлагает поточно-безопасную функцию очистки (которую не предлагает Intel TBB::ConcurrentVector). Учитывая параллельный вектор, основанный на std::vector и блокирующий мьютекс для каждого вызова функций очистки или push_back std::vector, как безопасно перебирать поток через параллельный вектор, используя цикл for? другими словами, как сделать iterate_thread в этом минимально воспроизводимом примере потокобезопасным? [code]#include using namespace std; // for the sake of minimal reproducible example template class ConcurrentVector { public: ConcurrentVector() : mMutex{} , mVector{} {} auto begin(){ scoped_lock lk(mMutex); return mVector.begin(); } auto end(){ scoped_lock lk(mMutex); return mVector.end(); } T& push_back(T t) { scoped_lock lk(mMutex); mVector.push_back(move(t)); return mVector.back(); } void clear() { scoped_lock lk(mMutex); mVector.clear(); } private: mutex mMutex; vector mVector; };
int main(){ ConcurrentVector vec{}; atomic_bool terminate_flag = false; jthread fill_thread{[&](){ static int i = 0; while(!terminate_flag){ this_thread::sleep_for(10ms); vec.push_back(++i); } }}; jthread clear_thread{[&](){ while(!terminate_flag){ this_thread::sleep_for(1s); vec.clear(); } }}; jthread iterate_thread{[&](){ while(!terminate_flag){ this_thread::sleep_for(400ms); for(auto i : vec){ cout