Привет, мужчины. Имеется вопрос, возник в ходе работы над завершением программы. Упрощаю до сути - имеется ли здесь data race?
#include <thread>
#include <mutex>
#include <vector>
#include <chrono>
#include <memory>
#include <iostream>
using namespace std;
class Thread_pool {
vector<thread> th;
mutex mtx;
atomic_flag stop_flag;
bool destruction_stage = false;
public:
~Thread_pool() {
stop_flag.test_and_set(memory_order_relaxed);
if (true) {
lock_guard l(mtx);
destruction_stage = true;
}
std::cout << th.size() << "is running" << endl; // 16
for (thread &t : th)
t.join();
}
bool add_thread(void(f)(atomic_flag *)) {
lock_guard l(mtx);
if (destruction_stage)
return false;
th.push_back(thread(f, &stop_flag));
return true;
}
} th_pool;
void tf(atomic_flag *f) {
while (! f->test(memory_order_relaxed)) {
this_thread::sleep_for(1s);
for (int i = 0; i < 3; ++i)
th_pool.add_thread(tf);
}
}
int main() {
th_pool.add_thread(tf);
this_thread::sleep_for(3s);
}
Имеется разделяемй между потоками ресурс (сам пул в данном случае). Всё внимаение на деструктор пула - логично, что нельзя взять мьютекс и убивать всех не спеша, другой поток так же захочет этот мьютекс и случится deadlock, в нём я ставлю флаг, который не даёт конкурирующим потокам дальше как-то использовать данные, сразу выход в add_thread(). Расчёт на то, что мьютекс при котором флаг установлен - последнее в цепи его событий, ну а раз так, то ни один поток (кроме главного) не может после этого события данные использовать. Но я не уверен, например вот:
atomic_thread_fence imposes stronger synchronization constraints than an atomic store operation with the same std::memory_order. While an atomic store-release operation prevents all preceding reads and writes from moving past the store-release, an atomic_thread_fence with memory_order_release ordering prevents all preceding reads and writes from moving past all subsequent stores.
Т.е. если правильно понял, то atomic_thread_fence может гарантировать, что какая-нибудь запись не пролезет до него, а вот с простыми атомиками такой гарантии уже не будет. А мьютексы?
С санитарами собирал, data race не находят.
PS: ГПТ беседу не вывозит, нужно мнение кожаных экспертов.