Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
Модератор
Эксперт Java
2710 / 1208 / 387
Регистрация: 11.08.2017
Сообщений: 3,733
Записей в блоге: 2
1

Правильная работа с контекстами в многопоточной программе

30.08.2021, 22:49. Показов 1624. Ответов 3

Author24 — интернет-сервис помощи студентам
Собственно главный вопрос, как правильно работать с контекстами когда имеется несколько потоков? Я знаю что opengl и так асинхронный, но многопоточность нужна для тяжелых операций вне opengl и загрузки их результатов в видеокарту. Создать контекст не проблема, так же не проблема в виде обмена ресурсами между контекстами (картинки, буферы и тд). У меня несколько иных вопросов (знаю что 1вопрос = 1 тема, но вопросы связаны между собой сильно).
Обязательно ли на каждый поток создавать свой контекст или можно обойтись одним?
Когда делать контексты активными? То есть можно ли сделать активным главный сразу после создания, а дополнительные при запуске потоков? Или нужно их переактивировать при каждом действии? И если один контекст то в каждом потоке надо переактивровать постоянно?
Хотелось бы иметь минимально возможное количество контекстов это раз и минимум их переключений это два.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.08.2021, 22:49
Ответы с готовыми решениями:

Медленная работа и ловля исключений в многопоточной программе
Здравствуйте. Сразу хочу предупредить, что это мой первый проект поэтому судите строго, но не...

Работа с контекстами в Modx
Всем доброго дня! Столкнулся с проблемой при работе с контекстами в Modx. Делал все по...

Работа с двумя контекстами через getproducts
У меня есть расширенный поиск, и он ищет только в одном контексте, а у меня одна очень важная...

Ошибка в многопоточной программе
Здравствуйте! Есть простая программа, которая выдает список всех папок в заданной папке (включая...

3
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
30.08.2021, 23:54 2
Лучший ответ Сообщение было отмечено alecss131 как решение

Решение

Цитата Сообщение от alecss131 Посмотреть сообщение
Обязательно ли на каждый поток создавать свой контекст или можно обойтись одним?
В теории можно, но чтобы это было эффективно в многопоточке, придется грамотно разделять владение, чтоб ни один поток не простаивал, пока контекст занят. Проще каждому потоку дать свой контекст.
Цитата Сообщение от alecss131 Посмотреть сообщение
Когда делать контексты активными? То есть можно ли сделать активным главный сразу после создания, а дополнительные при запуске потоков? Или нужно их переактивировать при каждом действии? И если один контекст то в каждом потоке надо переактивровать постоянно?
В каждом потоке может быть только один активный контекст в данный момент времени и один контекст может быть активным только в одном потоке. Активировать когда нужно и только в том потоке где нужен, т.е. активация дополнительного контекста в главном потоке не сделает его активным в другом, активируй его в функции потока.
Цитата Сообщение от alecss131 Посмотреть сообщение
Хотелось бы иметь минимально возможное количество контекстов это раз и минимум их переключений это два.
Пул потоков и каждому потоку работающему с opengl свой контекст. Обычно хватит двух таких потоков (один для рендера, другой для загрузки) А дальше уже смотри, если потоки дающие команды этим двум простаивают из-за заполнения очередей их команд, то попробуй добавить нужный.
1
Модератор
Эксперт Java
2710 / 1208 / 387
Регистрация: 11.08.2017
Сообщений: 3,733
Записей в блоге: 2
31.08.2021, 00:10  [ТС] 3
Цитата Сообщение от zayats80888 Посмотреть сообщение
В каждом потоке может быть только один активный контекст в данный момент времени и один контекст может быть активным только в одном потоке. Активировать когда нужно и только в том потоке где нужен, т.е. активация дополнительного контекста в главном потоке не сделает его активным в другом, активируй его в функции потока.
То есть можно как я написал, главный контекст активировать (в смысле makeCurrent) в главном потоке, а дополнительный контекст в дополнительном потоке при его старте и все? То есть никаких дополнительных переключений.

То есть в случае с бустом, как то так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
GLFWwindow* child;
 
void fun() {
    glfwMakeContextCurrent(child);
    while(true) {}
}
 
int main() {
    GLFWwindow* window{glfwCreateWindow(800, 600, "window", nullptr, nullptr)};
    child = glfwCreateWindow(1, 1, "hide", nullptr, window);
    glfwMakeContextCurrent(window);
    boost::thread t{&fun};
    while(true) {}
}
и внутри while работа с opengl
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
31.08.2021, 00:16 4
Цитата Сообщение от alecss131 Посмотреть сообщение
То есть никаких дополнительных переключений.
Ну а что переключать то?
Цитата Сообщение от alecss131 Посмотреть сообщение
То есть в случае с бустом, как то так
Ага (не важно, с бустом или без).
Там только с glfw поаккуратнее (смотри доки), большинство функций не потокобезопасны.
1
31.08.2021, 00:16
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.08.2021, 00:16
Помогаю со студенческими работами здесь

Метод For в многопоточной программе
Почему данный код не компилируется и как исправить ошибку? using System; using...

Назначение параметров в многопоточной программе
Ребят от чего зависит вот эти параметры в моей программе? Mythread t1 = new...

Безопасный список в многопоточной программе
Итак, пусть есть некоторая программа. Предположим, что это игровой сервер. Необходимо вести в...

Одновременный инкремент в многопоточной программе
Подпрограмма выполняется в многопоточном режиме. i, j - глобальные переменные. Каждый поток...

Сигналы и слоты в многопоточной программе.
Столкнулся с непонятным мне поведением в следующей ситуации. Есть класс "логгера". Его назначение...

Функция с fprintf в многопоточной программе
Насколько я знаю, fprintf не многопоточен. Т.е. я не могу просто взять и использовать fprintf() в...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Интеграция Arduino и ChatGPT: Практическое руководство
InfoMaster 16.01.2025
В современную эпоху технологических инноваций интеграция искусственного интеллекта с микроконтроллерами открывает принципиально новые возможности для создания умных устройств и автоматизированных. . .
Как создать робота, управляемого ChatGPT
InfoMaster 16.01.2025
Концепция проекта В современную эпоху искусственный интеллект и робототехника становятся все более доступными для энтузиастов и разработчиков. Создание роботизированной руки, управляемой ChatGPT,. . .
Как создать ChatGPT бота в Telegram на Python
InfoMaster 16.01.2025
В современном мире технологии искусственного интеллекта становятся все более доступными для разработчиков, открывая новые возможности для создания умных и интерактивных приложений. Одним из самых. . .
Машинное обучение с помощью Python
InfoMaster 16.01.2025
Машинное обучение стало неотъемлемой частью современных технологий, позволяя компьютерам учиться на основе данных и принимать решения без явного программирования. В сочетании с языком. . .
Использование связки C# и PHP в корпоративной разработке и микросервисной архитектуре
InfoMaster 16.01.2025
Введение в интеграцию C# и PHP В современной корпоративной разработке все чаще возникает потребность в создании гибких и масштабируемых решений, способных эффективно решать широкий спектр. . .
Как использовать Kerio дома для управления сетью и пользователями
InfoMaster 16.01.2025
Использование технологий для улучшения повседневной жизни стало неотъемлемой частью современного быта. Одной из таких технологий является Kerio — мощный инструмент для управления сетью и. . .
Есть ли будущее у DVD и Blu-ray?
InfoMaster 16.01.2025
В эпоху стремительного развития цифровых технологий и повсеместного распространения потоковых сервисов вопрос о будущем физических носителей информации становится все более актуальным. Особенно остро. . .
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru