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

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

Войти
Регистрация
Восстановить пароль
 
ikudesnik
0 / 0 / 0
Регистрация: 02.08.2015
Сообщений: 117
#1

Разбить на потоки - C++

05.02.2016, 21:31. Просмотров 224. Ответов 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
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
100
101
102
103
104
105
106
107
#include "stdafx.h"
#include <cctype>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <locale>
using namespace System;
 
const int row = 26;
const int col = 26;
const int len = 3;
char mas[row][col][len];
char mas_ascii[256];
 
int main() 
{
      std::locale current_locale("");
      std::locale::global(current_locale);
 
    for (int i=0; i<row; i++)
        for (int j=0; j<col; j++)
        {
            mas[i][j][0] = i+'A';
            mas[i][j][1] = j+'A';
            mas[i][j][2] = '\0';
        }
 
        // Выводим на экран таблицу шифрования
 /* 
    for (int i=0; i<row; i++)
    {
        for (int j=0; j<col; j++)
            std::cout<<mas[i][j]<<" ";
        std::cout<<std::endl;
    }
*/
 
    //Заполняем таблицу с символами ASCII
     for (int i = 0; i < 256; ++i)
        {   
            mas_ascii[i] = Convert::ToChar(i);
        }
    //Выводим на экран массив ascii
/* 
    for (int i = 0; i < 256; ++i)
    {
    std::cout << i << " " << mas_ascii[i]<< std::endl;
    }
*/
 
 
    //Открываем файл для чтение исходного текста
    std::vector <std::string> str;
    std::string buff;
    std::ifstream ifs("in.txt", std::ios_base::binary);
    if (!ifs) std::cout << "Unable to open file in.txt" << std::endl;  
 
    while (getline(ifs, buff))
        {   
            str.push_back(buff);
        }   
 
/*
    for (int i = 0; i < str.size(); i++)
        {
            std::cout << str[i];
        }
    std::cout << std::endl;
*/
    std::vector <std::string> strresult;
    //Открваем файл для записи шифрованного текста
    std::ofstream ofs("out.txt");
    if(ofs.is_open())
    {       
        for (int i = 0; i < str.size(); i++)
            {
                std::string a = str[i];
                for(int k = 0; k < a.size(); ++k)
                {
                    for (int j = 0; j < 256; j++)
                    {
                        if(a[k]==mas_ascii[j])
                        {
                            int jx=j;
                            int xx = jx/26;
                            int yx = jx%26;
                            ofs << mas[xx][yx];                        
                            strresult.push_back(mas[xx][yx]); 
                        }  
                        
                    }
                }
            }
 
        for (int i = 0; i < strresult.size(); i++)
            {
                std::cout << strresult[i];
            }
        std::cout << std::endl;
        ofs.close();
    }
    else
        std::cerr << "Unable to open file out.txt" << std::endl;
    std::system("pause");
    return 0;
}
Хочу разбить на потоки:
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// ConsoleApplication4.cpp: главный файл проекта.
 
#include "stdafx.h"
#include <cctype>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <locale>
#include <pthread.h>
using namespace System;
 
const int row = 26;
const int col = 26;
const int len = 3;
char mas[row][col][len];
char mas_ascii[256];
 
std::vector <std::string> *strresult;
std::vector <std::string> str;
 
struct bound { int begin ; int end ; } ;
 
void *crypto (void *param)
 
{
 
 
bound *b = (bound *)param ;
 
for (int i = b->begin; i < b->end; i++)
            {
                std::string a = str[i];
                for(int k = 0; k < a.size(); ++k)
                {
                    for (int j = 0; j < 256; j++)
                    {
                        if(a[k]==mas_ascii[j])
                        {
                            int jx=j;
                            int xx = jx/26;
                            int yx = jx%26;                       
                            strresult.push_back(mas[xx][yx]); 
                        }  
                        
                    }
                }
            }
return (void *) strresult; //возвращение результата
}
 
 
 
int main() 
{
      std::string buff;
      std::vector <std::string> *str1;
      std::vector <std::string> *str2;
      bound b ; //границы вычислений для первого потока
      bound c ; //границы вычислений для второго потока
 
 
 
      std::locale current_locale("");
      std::locale::global(current_locale);
 
    for (int i=0; i<row; i++)
        for (int j=0; j<col; j++)
        {
            mas[i][j][0] = i+'A';
            mas[i][j][1] = j+'A';
            mas[i][j][2] = '\0';
        }
 
        // Выводим на экран таблицу шифрования
 /* 
    for (int i=0; i<row; i++)
    {
        for (int j=0; j<col; j++)
            std::cout<<mas[i][j]<<" ";
        std::cout<<std::endl;
    }
*/
 
    //Заполняем таблицу с символами ASCII
     for (int i = 0; i < 256; ++i)
        {   
            mas_ascii[i] = Convert::ToChar(i);
        }
    //Выводим на экран массив ascii
/* 
    for (int i = 0; i < 256; ++i)
    {
    std::cout << i << " " << mas_ascii[i]<< std::endl;
    }
*/
 
 
    //Открываем файл для чтение исходного текста
    
    
    std::ifstream ifs("in.txt", std::ios_base::binary);
    if (!ifs) std::cout << "Unable to open file in.txt" << std::endl;  
 
    while (getline(ifs, buff))
        {   
            str.push_back(buff);
        }   
 
/*
    for (int i = 0; i < str.size(); i++)
        {
            std::cout << str[i];
        }
    std::cout << std::endl;
*/  
    
    pthread_t thread1, thread2;
    b.begin = 0;
    b.end = str.size()/2 ;
    pthread_create(&thread1,NULL,crypto,(void *)&b);
    c.begin = str.size()/2+1;
    c.end = str.size();
    pthread_create(&thread2,NULL,crypto,(void *)&c);
 
    pthread_join(thread1,(void **)&str1);
    pthread_join(thread2,(void **)&str2);
 
    //Открываем файл для записи шифрованного текста
    std::ofstream ofs("out.txt");
    if(ofs.is_open())
    {       
        
        /*for (int i = 0; i < strresult.size(); ++i)
            {
                ofs << strresult[i];
            }
 
        for (int i = 0; i < strresult.size(); i++)
            {
                std::cout << strresult[i];
            }*/
 
        std::cout << std::endl;
        ofs.close();
    }
    else
        std::cerr << "Unable to open file out.txt" << std::endl;
    delete str1; delete str2 ;
    std::system("pause");
 
    
    return 0;
}
Действую по аналогу:
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
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int A[100], B[100] ; //два вектора
struct bound //структура, определяющая границы вычислений потоков
{ int begin ; int end ; } ;
//стартовая функция для обоих порожденных потоков
void * func (void *param)
{
bound *b = (bound *)param ; //преобразование из void* в bound*
int *sum ; //скалярное произведение
sum = new int ;
int i ; //счетчик для цикла
//вычисление скалярного произведения
for (i=b->begin, *sum=0 ; i<b->end ; i++) *sum += A[i]*B[i] ;
return (void *)sum ; //возвращение результата
}
int main()
{
int i ; //счетчик для цикла
int *sum1 ; //для получения результата вычислений первого потока
int *sum2 ; //для получения результата вычислений второго потока
bound b ; //границы вычислений для первого потока
9
bound c ; //границы вычислений для второго потока
for (i=0 ; i<100 ; i++)
{ //заполнение массивов А и В случайными числами от 0 до 10
A[i] = (int)(random()/(RAND_MAX/10)) ;
B[i] = (int)(random()/(RAND_MAX/10)) ;
}
//идентификаторы для созданных потоков
pthread_t thread1, thread2 ;
b.begin = 0 ; b.end = 50 ;
//создание первого потока, производящего вычисления от 0 до 50
pthread_create(&thread1,NULL,func,(void *)&b) ;
c.begin = 50 ; c.end = 100 ;
//создание первого потока, производящего вычисления от 50 до 100
pthread_create(&thread2,NULL,func,(void *)&c) ;
//ожидание завершения первого потока, в sum1 записывается адрес
//результата вычислений первого потока
pthread_join(thread1,(void **)&sum1) ;
//ожидание завершения второго потока
pthread_join(thread2,(void **)&sum2) ;
fprintf(stdout,"Скалярное произведение = %d",*sum1+*sum2) ;
delete sum1 ; delete sum2 ;
return 1 ;
}
Возникла проблемка :
C++
1
strresult.push_back(mas[xx][yx]);  // выражение должно иметь тип класса.
Может я вообще не то делаю, пожалуйста подскажи.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2016, 21:31     Разбить на потоки
Посмотрите здесь:

Потоки! C++
C++ Потоки
Разбить программу на потоки C++
Потоки с++ C++
потоки.. C++
потоки C++
Потоки C++
C++ Потоки
C++ Потоки с++11
Потоки C++
потоки с++ C++
Потоки C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Olej
123 / 117 / 13
Регистрация: 25.03.2012
Сообщений: 456
05.02.2016, 21:44     Разбить на потоки #2
Если это C++ (не C), то не нужно пользоваться POSIX API pthread_t (pthread_create() и др.), а пользуйтес классом thread (который C++ заимствовал из Boost).
ikudesnik
0 / 0 / 0
Регистрация: 02.08.2015
Сообщений: 117
05.02.2016, 21:51  [ТС]     Разбить на потоки #3
C++
1
2
int *sum ;
sum = new int ;
можно ли идентично сделать с

C++
1
std::vector <std::string> *strresult;
Olej, а так работать не будет?
Olej
123 / 117 / 13
Регистрация: 25.03.2012
Сообщений: 456
05.02.2016, 22:35     Разбить на потоки #4
Цитата Сообщение от ikudesnik Посмотреть сообщение
можно ли идентично сделать с
А почему нет?
C++
1
vector<string> *strresult = new vector<string>( 20 );
Будет ли пример работать? Не знаю...
Нельзя выкладывать на просмотр такие большие куски кода, да ещё и плохо структурированного.
ikudesnik
0 / 0 / 0
Регистрация: 02.08.2015
Сообщений: 117
06.02.2016, 07:47  [ТС]     Разбить на потоки #5
Olej, а в скобочках 20 что означает, сколько максимум строк можно положить в вектор?

Добавлено через 27 минут
В примере после объявления
C++
1
2
int *sum ;
sum = new int ;
производят операцию
C++
1
*sum+=A[i]*A[i] ;
а мне после объявления
C++
1
vector<string> *strresult = new vector<string>( 20 );
как провести операцию?
C++
1
strresult.push_back(mas[xx][yx]);
Yandex
Объявления
06.02.2016, 07:47     Разбить на потоки
Ответ Создать тему
Опции темы

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