Чтобы понять, как использовать Atomics в C++ 11, я попытался следующий фрагмент кода:нить :: присоединиться() блоки, когда он не должен
#include <iostream>
#include <thread>
#include <atomic>
using namespace std;
struct solution {
atomic<bool> alive_;
thread thread_;
solution() : thread_([this] {
alive_ = true;
while (alive_);
}) { }
~solution() {
alive_ = false;
thread_.join();
}
};
int main() {
constexpr int N = 1; // or 2
for (int i = 0; i < N; ++i) {
solution s;
}
cout << "done" << endl;
}
Если N равно 1, то выход done
, Однако, если я установил его равным 2, основной поток блокирует thread: join(). Почему вы думаете, что мы не видим done
при N> 1?
Примечание: Если я использую следующий конструктор:
solution() : alive_(true), thread_([this] {
while (alive_);
}) { }
печатает done
при любом значении N.
@ Ангел написал ранее, поэтому я пометил его ответ как правильный. –
'atomic' по умолчанию не инициализируется 'false': [atomics.types.generic]/5 требует, чтобы атомы имели тривиальные конструкторы по умолчанию. Обратите внимание, что реализация стандартной библиотеки Visual C++ * делает * значение-инициализировать атомику, которая не соответствует требованиям. –
Casey
@ Casey интересно, вы правы (29.5/5, что я бы оценил, если бы вы упомянули). Во всяком случае, это только более сильный аргумент для явной инициализации флага. –