Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 10.04.2017
Сообщений: 79

Запустить число потоков соответствующее количеству ядер процессора

18.11.2018, 08:21. Показов 4513. Ответов 6

Студворк — интернет-сервис помощи студентам
Требуется определить колл ядер процессора и запустить соответствующее колл ядрам число потоков.
Если я уберу весь switch тогда программа корректно запустит 4 потока.


Я понимаю что увожу из зоны видимости эти все команды.Но как реализовать такой выбор без операторов ветвления, которые внутри себя по дефолту имеют {}.И соответственно тоже выведут из зоны видимости

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int main()
{ 
 
 
switch (thread::hardware_concurrency())
    {
    case 4:
        thread tr1(SuperMath1);
        thread tr2(SuperMath1);
        thread tr3(SuperMath);
 
    case 8:
        
    default:
        
    }
 
 
    SuperMath();
        
    switch (thread::hardware_concurrency())
    {
    case 4:
        tr1.join();
        tr2.join();
        tr3.join();
 
    case 8:
 
    default:
}
return 0;

А сейчас у меня ошибки:

E0546 передача управления в обход инициализации ( указывает на switch)
E0728 использование имени пространства имен не допускается( Указывает на строчку где tr1.join())
E0020 идентификатор "tr2" не определен (Указывает на строчку где tr2.join())
E0020 идентификатор "tr3" не определен (Указывает на строчку где tr3.join())
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.11.2018, 08:21
Ответы с готовыми решениями:

Определить загруженность ядер процессора
Помогите определить загруженность ядер процессора (может как-нибудь получить эти данные из системы).

Определение колличества ядер процессора
#include <stdio.h> #include <tchar.h> #include <iostream> #include <windows.h> #include <omp.h> using namespace std; int...

Выбор процессора по количеству ядер и частоте
Какой процессор лучше взять AMD FX-4300 3.8GHz/5200MHz/4MB sAM3+ BOX или AMD FX-6100 3.3GHz/2600MHz/8MB sAM3+ BOX. В первом больше...

6
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
18.11.2018, 09:53
Цитата Сообщение от Dethlord Посмотреть сообщение
передача управления в обход инициализации
Если не case 4, то переменные tr1,tr2,tr3 не будут объявлены.
Если они нужны только в case 4, то локализуйте их:

C++
1
2
3
4
5
6
case 4:
{
        thread tr1(SuperMath1);
        thread tr2(SuperMath1);
        thread tr3(SuperMath);
}
Если они нужны вне switch, то вынесите их объявление перед switch
А то получается, что в строках 24-26 Вы вообще забыли объявить их тип.
1
0 / 0 / 0
Регистрация: 10.04.2017
Сообщений: 79
18.11.2018, 11:12  [ТС]
Цитата Сообщение от zss Посмотреть сообщение
Если не case 4, то переменные tr1,tr2,tr3 не будут объявлены.
Е
спс одной ошибки меньше.Но join всеравно не видит(скорей всего что не объявил threads)
Цитата Сообщение от zss Посмотреть сообщение
Если они нужны вне switch, то вынесите их объявление перед switch
А то получается, что в строках 24-26 Вы вообще забыли объявить их тип.
А как это сделать? ведь конструкция thread tr3(SuperMath); подразумевает объявление и одновременно запуск функции.

Добавлено через 7 минут
Цитата Сообщение от zss Посмотреть сообщение
Если они нужны вне switch, то вынесите их объявление перед switch
Если их вынести за все условия то запустятся все 4 потока ,а если там будет 8 ядерный проц тогда запустит только 4 потока а нужно будет все 8


все спс решил ,я разместил всю логику в case соответственно там все в зоне видимости
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,100
18.11.2018, 11:18
Цитата Сообщение от Dethlord Посмотреть сообщение
А как это сделать? ведь конструкция thread tr3(SuperMath); подразумевает объявление и одновременно запуск функции.
C++
1
2
3
4
5
6
std::thread t[100]; // объявление без запуска
{
  t[0] = std::thread(myfunc); // запуск и инициализация ранее объявленной переменной
  t[1] = std::thread(myfunc); // запуск и инициализация ранее объявленной переменной
  ...
}
0
0 / 0 / 0
Регистрация: 10.04.2017
Сообщений: 79
18.11.2018, 14:48  [ТС]
Цитата Сообщение от Ygg Посмотреть сообщение
2
3
4
5
6
std::thread t[100]; // объявление без запуска
{
* t[0] = std::thread(myfunc); // запуск и инициализация ранее объявленной переменной
* t[1] = std::thread(myfunc); // запуск и инициализация ранее объявленной переменной
* ...
}
Было бы очень хорошо если так
но ошибок выскакивает больше чем строк в коде
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,100
18.11.2018, 15:14
Лучший ответ Сообщение было отмечено Dethlord как решение

Решение

А так?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <thread>
 
void myfunc(int num)
{
    std::cout << num << std::endl;
}
 
int main()
{
    std::thread t[100];
 
    for (int i=0; i<10; i++)
        t[i] = std::thread(myfunc, i);
 
    for (int i=0; i<100; i++)
    {
        if (t[i].joinable())
            t[i].join();
    }
 
    return 0;
}
1
0 / 0 / 0
Регистрация: 10.04.2017
Сообщений: 79
19.11.2018, 14:22  [ТС]
не поверишь ,написал также как ты показал но без (t[i].joinable())
а код выше твой заработал без ошибок (просто мне нужно было перестроить решение)

Добавлено через 1 минуту
ну и я делал с
C++
1
using namespace std;
Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
int CoreCount = thread::hardware_concurrency();
 
    for (size_t i = 0; i < CoreCount-1; i++)
    {
        t[i] = thread(SuperMath); // инициализация и запуск функций в потоках 
    }
    
    for (size_t i = 0; i < CoreCount-1; i++)
    {
        t[i].join(); // ждем окончание работы всех потоков 
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.11.2018, 14:22
Помогаю со студенческими работами здесь

Каждое слово строки заменить на число, соответствующее количеству символов в слове
Задана строка символов . группы символов, разделенные пробелом и не содержащие пробелов внутри себя, будем называть словами. Каждое слово...

Как задать число ядер процессора
Как задать число ядер процессора, которое может использовать приложение программно. Linux.

Машина Тьюринга. Дано двоичное число. Слева записать десятичное значение, соответствующее количеству нечетных триад
Дано двоичное число, содержащее 3n разрядов. Слева записать десятичное значение, соответствующее количеству нечетных триад. Начальное...

Перед каждой группой одинаковых букв, вставить число, соответствующее количеству букв
Помогите пожалуйста, очень прощу! В слове, состоящим из цифр и букв и заканчивающимся точкой, перед каждой группой одинаковых букв,...

Сколько нужно ядер/потоков оффисному компу
Ну с видеообработкой вроде информация имеется, люди пробуют, проводят тесты, и можно сделать выводы об многоядерности процессоров, но как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru