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

работа с тремя параллельными потоками - C++

Восстановить пароль Регистрация
 
AgentumA
2 / 1 / 0
Регистрация: 05.05.2010
Сообщений: 75
09.11.2010, 21:35     работа с тремя параллельными потоками #1
У меня есть программа...
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <iomanip>
#include <math.h>
#include <stdio.h>
#include <windows.h>
#include "conio.h"
 
 
using namespace std;
 
class Entr 
{
private:    
    int code[256];
    int n, i, ch;
    unsigned char chh,chl;
    double sum;
    double  prob;
    void InitCode();
 
 
public:
    double entr;
    Entr(){};
    ~Entr(){};
    void Count();
    void CountEntr();
    void PrintEntr();
    void Interface();
};
 
//inicializacija massiva 4astot
void Entr::InitCode()
{
    for (int j=0; j < 256; j++)
        code[j]=0;
};
 
//podschet 4astot vhozhdenija simvolov  
void Entr::Count()
{
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 setlocale(LC_CTYPE,"Russian");    //колдуем с кодировками и т.д.
    ifstream inf("input.txt");
    sum=0;
    while(!inf.eof()) 
    {
        inf >> chh;
        chl=unsigned char(tolower(chh)); //перевод в нижний регистр
        ch=(int) chl;
        code[ch]++; 
        sum++; 
    }
    sum--;
    code[ch]--;
    inf.close();
};
 
//raschet entropii
void Entr::CountEntr() 
{
    InitCode();
    Count();
    entr=0;
    for (int i=0; i < 256; i++)
    {
        if (code[i]>0){
            prob=code[i]/sum; 
            entr-=(prob*log(prob)/log(2.0));}
    }
};
 
void Entr::PrintEntr() 
{
    cout << "Bytes in file: " << sum <<"\n"<<"\n"<<"Entropy of file=" << entr <<"\n";
    getch();
};
 
void Entr::Interface()
{
    cout<<"Calculation of file's entropy(by default:input.txt)"<<"\n";
    cout<<"---------------------------------------------------"<<"\n";
};
 
void main()
{
Entr ent;
ent.Interface();
ent.CountEntr();
ent.PrintEntr();
}
как мне сделать чтобы она работала в три параллельных потока?про потоки ничего не знаю...подскажите пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2010, 21:35     работа с тремя параллельными потоками
Посмотрите здесь:

C++ Работа с потоками
C++ работа с потоками
Работа с потоками. C++
C++ Работа с потоками
C++ Работа с потоками
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
.::.DIMA.::.
142 / 142 / 4
Регистрация: 26.10.2008
Сообщений: 782
10.11.2010, 00:06     работа с тремя параллельными потоками #2
Цитата Сообщение от AgentumA Посмотреть сообщение
про потоки ничего не знаю...подскажите пожалуйста.
А здесь смотрели?
AgentumA
2 / 1 / 0
Регистрация: 05.05.2010
Сообщений: 75
10.11.2010, 18:39  [ТС]     работа с тремя параллельными потоками #3
смотрел я,но туго ибо примеров стоящих не нашел.поэтому прошу помощи как создать хотя бы 1 поток для моей проги...
unStatiK
Заблокирован
10.11.2010, 18:44     работа с тремя параллельными потоками #4
Цитата Сообщение от AgentumA Посмотреть сообщение
смотрел я,но туго ибо примеров стоящих не нашел.поэтому прошу помощи как создать хотя бы 1 поток для моей проги...
здесь есть статья
AgentumA
2 / 1 / 0
Регистрация: 05.05.2010
Сообщений: 75
10.11.2010, 22:41  [ТС]     работа с тремя параллельными потоками #5
спс за инфу,оч полезна,но все же кто сможет привести один поток для проги буду очень благодарен
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,133
Записей в блоге: 26
10.11.2010, 22:49     работа с тремя параллельными потоками #6
http://www.intuit.ru/department/pl/cil/11/
Сверху есть квадратики с номерами лекций. Почитай 11-14. Некоторые лекции разбиты на несколько страниц
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
10.11.2010, 23:57     работа с тремя параллельными потоками #7
Скажи спасибо нормальным пацанам
AgentumA
2 / 1 / 0
Регистрация: 05.05.2010
Сообщений: 75
07.12.2010, 18:34  [ТС]     работа с тремя параллельными потоками #8
вот херню написал...
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <iomanip>
#include <math.h>
#include <stdio.h>
#include <windows.h>
#include "conio.h"
 
 
using namespace std;
 
class Entr 
{
private:    
    int code[256];
    int n, i, ch;
    unsigned char chh,chl;
    double sum;
    double  prob;
    void InitCode();
 
 
public:
    double entr;
    Entr(){};
    ~Entr(){};
    void Count();
    void CountEntr();
    void PrintEntr();
    void Interface();
};
 
//inicializacija massiva 4astot
void Entr::InitCode()
{
    for (int j=0; j < 256; j++)
        code[j]=0;
};
 
//podschet 4astot vhozhdenija simvolov  
void Entr::Count()
{
 //SetConsoleCP(1251);
 //SetConsoleOutputCP(1251);
 //setlocale(LC_CTYPE,"Russian");    //колдуем с кодировками и т.д.
    ifstream inf("input.txt");
    sum=0;
    while(!inf.eof()) 
    {
        inf >> chh;
        chl=unsigned char(tolower(chh)); //перевод в нижний регистр
        ch=(int) chl;
        code[ch]++; 
        sum++; 
    }
    sum--;
    code[ch]--;
    inf.close();
};
 
//raschet entropii
void Entr::CountEntr() 
{
    InitCode();
    Count();
    entr=0;
    for (int i=0; i < 256; i++)
    {
        if (code[i]>0){
            prob=code[i]/sum; 
            entr-=(prob*log(prob)/log(2.0));}
    }
};
 
void Entr::PrintEntr() 
{
    cout << "Bytes in file: " << sum <<"\n"<<"\n"<<"Entropy of file=" << entr <<"\n";
    getch();
};
 
void Entr::Interface()
{
    cout<<"Calculation of file's entropy(by default:input.txt)"<<"\n";
    cout<<"---------------------------------------------------"<<"\n";
};
 
void main()
{
PVOID var=&n;
 DWORD idThread;
 HANDLE h1;
 Entr ent;
ent.Interface();
 h1 = CreateThread (NULL, (DWORD)NULL, (LPTHREAD_START_ROUTINE)ent.CountEntr, var, (DWORD)NULL, &idThread);
WaitForSingleObject(h1, INFINITE);
ent.PrintEntr();
CloseHandle(h1);
}
бред бред бред...хелп ми(
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,133
Записей в блоге: 26
07.12.2010, 20:01     работа с тремя параллельными потоками #9
Внятно поставленный вопрос - это уже половина ответа. А до сих пор никто и не понял, что же ты хочешь и в чём проблема

Пример создания потока есть здесь
http://msdn.microsoft.com/en-us/libr...27(VS.85).aspx

При создании потока в качестве точки запуска можно указывать только обычную функцию или статический метод класса. НЕстатический метод класса (как это сделано у тебя) нельзя
AgentumA
2 / 1 / 0
Регистрация: 05.05.2010
Сообщений: 75
10.12.2010, 15:57  [ТС]     работа с тремя параллельными потоками #10
еще рааз сменил направление и визуал студию и о боже потоки pragma omp зарааботали!!!!
только вопрос...омп-потоки привязаны к многоядерности процессора?то есть для одноядерника бестолку создавать?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,133
Записей в блоге: 26
10.12.2010, 16:18     работа с тремя параллельными потоками #11
Цитата Сообщение от AgentumA Посмотреть сообщение
то есть для одноядерника бестолку создавать?
В конечном итоге ты получишь бинарник, готовый к распараллеливанию. Если этот бинарник запускать на одноядерном процессоре (на однопроцессорной машине), то потоки не будут создаваться вообще, а программа чуток замедлится (за счёт накладных расходов на run-time поддержку omp). А если бинарник будет исполняться на многоядерном процессоре или многопроцессорной машине, то оно автоматически распараллелится под нужное количество потоков.

Но надо смотреть в настройках, потому как в omp можно задать фиксированное количество потоков, а можно автоматическое (и в run-time будет вычисляться требуемое количество потоков)
AgentumA
2 / 1 / 0
Регистрация: 05.05.2010
Сообщений: 75
10.12.2010, 17:24  [ТС]     работа с тремя параллельными потоками #12
Evg, ну вот пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <omp.h>
 
int main()
{
   omp_set_dynamic(1);
   omp_set_num_threads(10);
   #pragma omp parallel        // параллельный регион 1
   {
      #pragma omp single
      printf("Num threads in dynamic region is = %d\n",
         omp_get_num_threads());
   }
   printf("\n");
   omp_set_dynamic(0);
   omp_set_num_threads(10);
   #pragma omp parallel        // параллельный регион 2
   {
      #pragma omp single
      printf("Num threads in non-dynamic region is = %d\n",
         omp_get_num_threads());
   }
Для первого региона мы включили динамическое создание потоков и установили число потоков в 10. По результатам работы программы видно, что при включенном динамическом создании потоков исполняющая среда OpenMP решила создать группу, включающую всего два потока, так как у компьютера два процессора. Для второго параллельного региона исполняющая среда OpenMP создала группу из 10 потоков, потому что динамическое создание потоков для этого региона было отключено.
То есть получается все-таки мы можем создать многопоточность в одноядернике?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
10.12.2010, 18:37     работа с тремя параллельными потоками #13
Цитата Сообщение от Evg Посмотреть сообщение
Если этот бинарник запускать на одноядерном процессоре (на однопроцессорной машине), то потоки не будут создаваться вообще
Так не пойдёт. Будем точны с терминами. (вед если нет нет потоков- ни одного то есть- нет и процесса). Потоки будут создаваться. Другое дело, что они не смогут работать ОДНОВРЕМЕННО.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,133
Записей в блоге: 26
10.12.2010, 19:22     работа с тремя параллельными потоками #14
Мне всегда казалось, что omp умеет определять, сколько исполняющих ядер в системе. И если только одно, то не плодить потоков вообще. Но это теоретические изыскания, на практике я с omp не работал.

В любом случае, даже если omp начинает создавать потоки по своему усмотрению, то даже на однопроцессорной системе этот код будет нормально работать, просто потоки будут исполняться по очереди (т.е. НЕ в параллель). Но мне всё-таки казалось, что одной из фич omp является динамическое определение требуемого количества потоков. Хотя я могу путать с какой-то другой системой автораспараллеливания (только вот не помню, как она называется)
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
10.12.2010, 19:48     работа с тремя параллельными потоками #15
Ну я эти знания почерпнул у Джефри Рихтера, может, будет интересно.
http://wm-help.net/books-online/book...464-25.html#h6
Глава 6-я, 7-я. А вот самое начало:
"Темашка, связанная потоками, очень важна, потому что в любом процессе должен быть хотя бы один поток"
...Про привязку к процессолрам там тоже сказано, что если есть несклько ядер, как там что куда привязывается. Но если ЕСТЬ НЕСКОЛЬКО. А если НЕТ НЕСКОЛЬКО (одно ядро то есть), то вроде как по умолчанию создаются потоки и всё. Тем убедительнее сия мысль, что там где-то у него прямым текстом сказано, что в распределении процессороного времени учавствуют именно ПОТОКИ (не процессы), что невозможно при отсутствии таковых.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2010, 00:02     работа с тремя параллельными потоками
Еще ссылки по теме:

Работа с потоками C++
C++ Сканирование подкаталогов, вывод параллельными потоками
C++ Работа с потоками

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,133
Записей в блоге: 26
11.12.2010, 00:02     работа с тремя параллельными потоками #16
kravam, по поводу главного процесса - его тоже можно считать потоком. Но просто считают, что когда исполняется только главный процесс, то потоков нет
Yandex
Объявления
11.12.2010, 00:02     работа с тремя параллельными потоками
Ответ Создать тему
Опции темы

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