Массив с функциями и многопоточность

238
09 февраля 2018, 21:08

У меня есть функции, вывод на экран их результатов мне нужно делать в main. Первая функция работает нормально и все правильно выводится, а вторая и третья - крэшатся. Что я не так делаю? Если делать вывод в функциях, то все работает. Но так как это многопоточность, то вывод получается не по порядку, и поэтому я решила вынести вывод в main.

std::once_flag flag;
const size_t arraySize = 1000;
int array[arraySize];
void fillWithRandomNumbers()
{
    std::srand(time(0));
    for (size_t index = 0; index < arraySize; ++index)
        array[index] = (rand() % 999 + 1);
}
void countEvenAndOddNumbers(int counter[2])
{
    std::call_once(flag, fillWithRandomNumbers);
    counter[0] = 0;
    counter[1] = 0;
    for (size_t index = 0; index < arraySize; ++index)
        ++counter[array[index] & 1];
}

int summ(int num)
{
    int sum = 0;
    while (num != 0)
    {
        sum += num % 10;
        num /= 10;
    }
    return sum;
}
void findDivisibleByThree(int* result, int* counter)
{
    std::call_once(flag, fillWithRandomNumbers);
    *counter = 0;
    for (size_t index = 0; index < arraySize; ++index)
    {
        if ((summ(index) % 3) == 0)
        {
            result[*counter] = array[index];
            ++*counter;
        }
    }
}
void countDivisibleByFiveOrSeven(int* count)
{
    std::call_once(flag, fillWithRandomNumbers);
    *count = 0;
    for (size_t index = 0; index < arraySize; ++index)
    {
        if ((((array[index] % 5) == 0)) || ((array[index] % 7) == 0))
            ++*count;
    }
}
int main()
{
    int array[arraySize];
    int counter[2];
    int* count;
    int* cou;
    std::thread t1(countEvenAndOddNumbers, counter);
    std::thread t2(findDivisibleByThree , array, cou);
    std::thread t3(countDivisibleByFiveOrSeven, count);
    t1.join();
    t2.join();
    t3.join();
    std::cout << "Even- " << counter[0] << "\n";
    std::cout << "Odd- " << counter[1] << "\n";
    std::cout << "EntireThree- " << *array << "\n";
    std::cout << "EntireFiveOrSeven- " << count << "\n";
    return 0;
}

UPD:

  int main()
  {
     int result[arraySize];
     int counter[2];
     int countByThree = 0;
     int countByFiveOrSeven = 0;
     std::thread t1(countEvenAndOddNumbers, counter);
     std::thread t2(findDivisibleByThree, result, &countByThree);
     std::thread t3(countDivisibleByFiveOrSeven, &countByFiveOrSeven);
     t1.join();
     t2.join();
     t3.join();
     std::cout << "Even- " << counter[0] << "\n";
     std::cout << "Odd- " << counter[1] << "\n";
     for (size_t index = 0; index < arraySize; ++index)
     {
         std::cout << "Array- " << result[index] << "\n";
     }
     std::cout << "findDivisibleByThree- " << countByThree <<  "\n";
     std::cout << "CountDivisibleByFiveOrSeven- " << countByFiveOrSeven << "\n";
     return 0;
  }
Answer 1

Я что-то не пойму -

int* count;
int* cou;

А где вы выделяете память? По-моему, вы пытаетесь писать в никуда, вернее, в не пойми куда...

int count = 0;
int cou = 0;
...
std::thread t2(findDivisibleByThree , array, &cou);
std::thread t3(countDivisibleByFiveOrSeven, &count);

Так будет лучше.

Ну, и, если я верно понимаю, то надо вот такой вывод:

std::cout << "EntireThree- " << cou << "\n";

Вот работающий пример.

READ ALSO
Общение между процессом-демоном и cli

Общение между процессом-демоном и cli

Есть процесс-демон и клиент с cliНеобходимо написать динамическую библиотеку для их общения, то есть клиент вводит команды, а процесс-демон...

215
Microsoft Visual C++ Runtime error

Microsoft Visual C++ Runtime error

Возникает периодически ошибка Runtime error: Когда в отладочном режиме запускаю, доходит до строчки ui->setupUi(this);

195
Как отключить автовоспроизведение в Selenium chromedriver?

Как отключить автовоспроизведение в Selenium chromedriver?

Использую chromedriver для тестирования, и необходимо отключить автовоспроизведение всех видеоКакие есть варианты это решить?

192