Мне нужен счетчик потокобезопасности для количества текущих объектов типа Apple
. Я попытался сделать простой с OpenMP, но я не понимаю, почему подсчет неверен. Вот упрощение класса, с фактическим тестового кода и фактического выхода:C++ счетчик объектов OpenMP неверный счет с std :: vector объектов
класса
class Apple {
public:
Apple();
~Apple();
static int getThreadCount();
private:
static int threadCount;
void threadCountIncrease();
void threadCountDecrease();
};
Apple::Apple() {
threadCountIncrease();
}
Apple::~Apple() {
threadCountDecrease();
}
void Apple::threadCountIncrease() {
#pragma omp critical(AppleThreadCount)
{
std::cout << "## COUNT ++" << "\n";
++threadCount;
}
}
void Apple::threadCountDecrease() {
#pragma omp critical(AppleThreadCount)
{
std::cout << "## COUNT --" << "\n";
--threadCount;
}
}
Тест кода
std::vector<Apple> apples;
cout << Apple::getThreadCount() << "\n";
for(int i=0; i<3; ++i) {
apples.push_back(Apple());
cout << Apple::getThreadCount() << "\n";
}
Вывод, который я не понимаю
## COUNT ++
## COUNT --
0
## COUNT ++
## COUNT --
## COUNT --
-1
## COUNT ++
## COUNT --
## COUNT --
## COUNT --
-3
## COUNT --
## COUNT --
## COUNT --
Почему существуют более «COUNT -» вхождения, чем «COUNT ++»? Почему последний показанный счет -3 вместо 3?
Благодаря принятым ответ, я в конечном счете отбрасывается, что я делал в пользу this solution.