Привет. Вопрос из прошлого, тогда я пришел к выводу, что дополнительную синхронизацию лучше делать, но хз, сейчас подошёл к подобному вопросу вновь. Ленюсь копать в сети, в прошлый раз однозначного ответа не нашел, вроде. Пример:
#include <thread>
#include <vector>
#include <memory>
#include <chrono>
#include <iostream>
#include <mutex>
using namespace std;
class Q {
mutex m;
int data {0};
public:
void incr() {
lock_guard lck(m);
++ data;
}
~Q() {
//lock_guard lck(m);
cerr << data << endl;
}
};
void th_fn(shared_ptr<Q> q) {
q->incr();
q.reset();
while (true);
}
int main() {
auto ob = make_shared<Q>();
vector<thread> v;
for (int i = 0; i < 5; ++ i)
v.emplace_back(th_fn, ob);
this_thread::sleep_for(3s);
ob.reset();
for (auto &t : v)
t.join();
}
Нужно ли брать мьютекс в деструкторе? TSAN не выдает ошибок при отсутсвующем взятие, но вроде как декремент счетчика в shared_ptr - relaxed операция (или нет?). Какие мысли?