У меня есть класс шаблона, подобный этому:Статический член со статическим мьютекса и потокобезопасности
template <typename T>
class Foo {
public:
static void show() {
unique_lock<mutex> l {mtx};
for (const auto& v : vec) {
cout << v << endl;
}
}
static void add (T s) {
unique_lock<mutex> l {mtx};
vec.push_back (s);
}
private:
static mutex mtx;
static vector<T> vec;
};
template <typename T> mutex Foo<T>::mtx;
template <typename T> vector<T> Foo<T>::vec;
и использование этого класса выглядит следующим образом:
Foo<string>::add ("d");
Foo<string>::add ("dr");
Foo<string>::add ("dre");
Foo<string>::add ("drew");
Foo<string>::show();
Не могли бы вы сказать мне, если этот класс является потокобезопасным? И если это не так, как сделать поточную безопасную версию?
Если я правильно понял, когда у нас есть класс с функциями-членами (не статическими) и мьютекс (не статическими), мы предотвращаем состояние гонки одного объекта, который прошел через потоки, правильно? И когда у нас есть что-то подобное этому, мы предотвращаем состояние гонки не для объекта, а для класса вместо этого - в данном случае для определенного типа, или я ошибаюсь?