想象我有以下幾點:使用操作當前對象的線程安全嗎?
struct A {
std::vector<int> _vect;
std::mutex _mutex;
void f() {
std::thread t1(&A::work, this);
std::thread t2(&A::work, this);
t1.join();
t2.join();
}
void work() {
std::vector<int> cvect;
while (true) {
bool keep = false;
_mutex.lock();
// get_next() modify the internal state of this
keep = get_next();
cvect = _vect; // copy of _vect
_mutex.unlock();
if (!keep) break;
// Do some stuff that does not require the `this`, e.g.:
std::sort(cvect.begin(), cvect.end());
int v = cvect.back() - cvect.front();
}
}
bool get_next() {
// This methods modify _vect
_vect = std::vector<int>{1, 2, 3, 4}; // e.g.
}
}
int main() {
A a;
a.f();
return 0;
}
以上編譯和工程(用更復雜的實現)。
它是否安全(如果不是,我怎樣才能使它安全?)?
期間
_work
可能發生什麼錯誤(這情況下沒有被正確處理?)?
'執行線程't1'和't2'時'A'對象生活。那麼,爲什麼你認爲你的代碼不安全? – Tsyvarev
@Tsyvarev我不認爲這是,但因爲我以前從來沒有操作'thread'和'mutex',我以爲我可能已經忘記了一些東西...... – Holt
「不需要這個指針」意味着沒有成員變量是訪問? –