Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
#1

Объясните принцип создания многопоточности - C++

04.05.2012, 11:10. Просмотров 741. Ответов 5
Метки нет (Все метки)

Здраствуйте, объясните пожалйста как сделать программу многопоточной, у меня есть одна программа, в которой большая нагрузка идет на главный цикл, если я правильно понимаю, то он обрабатывается одним потоком одного ядра процессора, как правильно оформить код, чтобы нагрузка равномерно распределялась на все ядра?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2012, 11:10     Объясните принцип создания многопоточности
Посмотрите здесь:

объясните принцип работы цикла : ? C++
Односвязные списки. Объясните принцип работы. C++
C++ Объясните, пожалуйста, принцип работы.
Ханойские башни, объясните принцип работы! C++
C++ Приложение на C++ для работы с API, подскажите/объясните принцип.
Объясните принцип C++
C++ Объясните принцип работы программы
Объясните принцип работы программы C++
C++ Объясните принцип бинарного поиска
C++ Объясните принцип работы части кода для вывода элементов контейнера
C++ Объясните пожалуйста принцип работы указателей
Объясните принцип защиты файлов от множественного включения C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
andy_111
90 / 59 / 2
Регистрация: 03.07.2011
Сообщений: 148
04.05.2012, 12:05     Объясните принцип создания многопоточности #2
У вас в чем вопрос : как создать поток или как привязать его к конкретному ядру? Механизм многопоточности не обязательно должен работать на нескольких ядрах - до появления многоядерных процессоров все великолепно работало на одноядерных. Если вкратце, то в системе есть шедулер (планировщик потоков), который в зависимости от приоритета потока выдает ему порции процессорного времени.

Добавлено через 18 минут
Сам поток создается функцией CreateThread, привязка его к конкретному ядру выполняется функцией SetThreadAffinityMask (в Windows).
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
04.05.2012, 14:07  [ТС]     Объясните принцип создания многопоточности #3
Например у меня 4-хядерный процессор, каждое ядро может выполнять 2 потока, в одном видеоконвертере видела как при конвертировании большого количества фильмов обрабатываются 8 фильмов одновременно, как на этом примере сделать подобное?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int main()
{
    bool bExit = false; 
 
    while( bExit != true ) 
    {
        function_1();
        function_2();
        function_3();
 
    }
    return 0;
}
andy_111
90 / 59 / 2
Регистрация: 03.07.2011
Сообщений: 148
04.05.2012, 14:20     Объясните принцип создания многопоточности #4
programina, работа с потоками имеет ряд особенностей - синхронизация, приоритеты и прочее. Кроме того, весьма полезно знать, как они работают в системе. Очень советую Вам сначала почитать про потоки и работу с ними - всех советов здесь все равно не дашь, в конечном итоге придется пересказать книгу Неплохо про потоки написано у Джефри Рихтера, например в книге "Windows для профессионалов. Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows.".
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
04.05.2012, 19:21  [ТС]     Объясните принцип создания многопоточности #5
С одновременным запуском разных функций ясно, сделать можно с помощью винапишной функции CreateThread, данная программа выводит одновременно четыере месажбокса:
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
33
34
35
36
37
38
39
40
41
42
43
44
#include <windows.h>
 
DWORD   dwThreadId;
 
DWORD WINAPI function_1( LPVOID lpParam );
DWORD WINAPI function_2( LPVOID lpParam );
DWORD WINAPI function_3( LPVOID lpParam );
DWORD WINAPI function_4( LPVOID lpParam );
 
 
int main()
{
    CreateThread( NULL, 0, function_1, 0, 0, &dwThreadId );
    CreateThread( NULL, 0, function_2, 0, 0, &dwThreadId );
    CreateThread( NULL, 0, function_3, 0, 0, &dwThreadId );
    CreateThread( NULL, 0, function_4, 0, 0, &dwThreadId );
 
    system( "pause" );
    return 0;
}
 
DWORD WINAPI function_1( LPVOID lpParam )
{
    MessageBox( NULL, "# 1", "msg", 0 );
    return( 0 );
}
 
DWORD WINAPI function_2( LPVOID lpParam )
{
    MessageBox( NULL, "# 2", "msg", 0 );
    return( 0 );
}
 
DWORD WINAPI function_3( LPVOID lpParam )
{
    MessageBox( NULL, "# 3", "msg", 0 );
    return( 0 );
}
 
DWORD WINAPI function_4( LPVOID lpParam )
{
    MessageBox( NULL, "# 4", "msg", 0 );
    return( 0 );
}
function_1, function_2, function_3 и function_4 выполняются одновременно, но каждый раз почему то в разной последовательности, еще научиться управлять ими так как нужно мне.

Добавлено через 19 минут
Добавила в начало каждой функции задержку при помощи Sleep(...)
C++
1
2
3
4
5
6
7
8
9
10
11
12
DWORD WINAPI function_1( LPVOID lpParam )
{
    Sleep(400);
    MessageBox( NULL, "# 1", "msg", 0 );
    return( 0 );
}
DWORD WINAPI function_2( LPVOID lpParam )
{
    Sleep(300);
    MessageBox( NULL, "# 2", "msg", 0 );
    return( 0 );
}
Теперь сначала появляется месажбокс "# 2", а потом "# 1"
andy_111
90 / 59 / 2
Регистрация: 03.07.2011
Сообщений: 148
04.05.2012, 20:30     Объясните принцип создания многопоточности #6
Я вижу, что вы проигнорировали мою рекомендацию насчет изучения литературы. Поверьте, подобные вопросы уже задавались и разбирались. Есть приоритеты, есть синхронизация - прошу вас, почитайте, многие вопросы отпадут сами собой. Кроме того, знания основ помогут выбрать изначально правильное направление-так, чтобы потом не пришлось переделывать все заново.
Yandex
Объявления
04.05.2012, 20:30     Объясните принцип создания многопоточности
Ответ Создать тему
Опции темы

Текущее время: 05:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru