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

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

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

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

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

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

Объясните принцип - C++
printf("%.2lf", x) Объясните пожалуйста понятным языком, что делает эта вещь "%.2lf"?

объясните принцип работы цикла : ? - C++
объясните принцип работы цикла : ?

Объясните принцип работы программы - C++
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <conio.h> ...

Объясните принцип работы программы - C++
Добрый день ( вечер ). Мне дано было задание: Определить класс, объектами которого являются многоугольники указанного типа. ...

Объясните, пожалуйста, принцип работы. - C++
Есть прога, считает сумму ряда, но ряд - знакочередующийся (-1,1,-1,...). При подсчете программа заканчивае работу на 1023 члене. Но чем...

Объясните принцип бинарного поиска - C++
Можно, пожалуйста, пример или принцип бинарного поиска. С++ для очень сильно начинающих.

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

Добавлено через 18 минут
Сам поток создается функцией CreateThread, привязка его к конкретному ядру выполняется функцией SetThreadAffinityMask (в Windows).
1
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;
}
0
andy_111
90 / 59 / 2
Регистрация: 03.07.2011
Сообщений: 148
04.05.2012, 14:20 #4
programina, работа с потоками имеет ряд особенностей - синхронизация, приоритеты и прочее. Кроме того, весьма полезно знать, как они работают в системе. Очень советую Вам сначала почитать про потоки и работу с ними - всех советов здесь все равно не дашь, в конечном итоге придется пересказать книгу Неплохо про потоки написано у Джефри Рихтера, например в книге "Windows для профессионалов. Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows.".
1
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"
0
andy_111
90 / 59 / 2
Регистрация: 03.07.2011
Сообщений: 148
04.05.2012, 20:30 #6
Я вижу, что вы проигнорировали мою рекомендацию насчет изучения литературы. Поверьте, подобные вопросы уже задавались и разбирались. Есть приоритеты, есть синхронизация - прошу вас, почитайте, многие вопросы отпадут сами собой. Кроме того, знания основ помогут выбрать изначально правильное направление-так, чтобы потом не пришлось переделывать все заново.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2012, 20:30
Привет! Вот еще темы с ответами:

Ханойские башни, объясните принцип работы! - C++
Можете мне &quot;расписать&quot; все что происходит в этом коде, плюс отдельные вопросы в &quot;комментариях&quot;, так что бы я сам смог это объяснить если...

Односвязные списки. Объясните принцип работы. - C++
обьясните плзз как раотает односвязный список

Объясните пожалуйста принцип работы указателей - C++
#include &lt;iostream&gt; using namespace std; int main() { int *p,num; p = &amp;num; *p=100;

Объясните принцип защиты файлов от множественного включения - C++
Unit.h #ifndef PROJECT1_UNIT_H #define PROJECT1_UNIT_H class Unit { int max_; public: Unit(int);


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

Или воспользуйтесь поиском по форуму:
6
Yandex
Объявления
04.05.2012, 20:30
Ответ Создать тему
Опции темы

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