Разные объекты C ++ мешают друг другу в потоке? - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь изучить технологию многопоточности C ++

Используемый мной компилятор g ++ соответствует C ++ 14

Я использую инструмент разработки CodeBlock

, который я создал10 различных объектов и использовали их в качестве начала потока

#include <iostream>       // std::cout
#include <thread>         // std::thread
#include <vector>         // std::vector
#include "TestClass.h"

int main ()
{
  std::vector<std::thread> threads;

  TestClass test[10];
  for (int i=1; i<=10; ++i){
    threads.push_back(std::thread(&TestClass::run,std::ref(test[i-1])));
  }

  std::cout << "synchronizing all threads...\n";
  for (auto& th : threads) th.join();

  for(int i=0;i<10;i++){
    std::cout << test[i].Getm_Counter() << std::endl;
  }
  return 0;
}

Содержимое потока выглядит следующим образом

#ifndef TESTCLASS_H
#define TESTCLASS_H


class TestClass
{
    public:
        TestClass();
        virtual ~TestClass();

        unsigned int Getm_Counter() { return m_Counter; }

        void run();

    protected:

    private:
        unsigned int m_Counter;
};

#endif // TESTCLASS_H

реализовать следующим образом

#include "TestClass.h"

TestClass::TestClass()
{
    //ctor
}

TestClass::~TestClass()
{
    //dtor
}

void TestClass::run(){
    for(int i=0;i<10;i++){
        m_Counter++;
    }
}

Я ожидаючто количество для каждого объекта равно 10, но результат не такой.Зачем? введите описание изображения здесь

1 Ответ

3 голосов
/ 18 марта 2019

Вы не инициализировали m_Counter (0 или любое другое значение). Таким образом, в конце вашего прогона можно ожидать чего-либо о его значении (в зависимости от значения мусора, которое он может принять) .

...