У меня есть функции, вывод на экран их результатов мне нужно делать в 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;
}
Я что-то не пойму -
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";
Вот работающий пример.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть процесс-демон и клиент с cliНеобходимо написать динамическую библиотеку для их общения, то есть клиент вводит команды, а процесс-демон...
Возникает периодически ошибка Runtime error: Когда в отладочном режиме запускаю, доходит до строчки ui->setupUi(this);
Использую chromedriver для тестирования, и необходимо отключить автовоспроизведение всех видеоКакие есть варианты это решить?