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

Многопоточность. Посчитать выражение - C++

Восстановить пароль Регистрация
 
isachenko
8 / 0 / 0
Регистрация: 24.05.2015
Сообщений: 5
25.05.2016, 07:42     Многопоточность. Посчитать выражение #1
Собственно, вот выражение: http://www.cyberforum.ru/cgi-bin/latex.cgi?x - (x^3\div3!) +(x^5\div5!) -(x^7\div7!) + (x^9\div9!).

Помогите, пожалуйста, решить. Необходимо с помощью потоков реализовать подсчёт его значения. Значение переменной x вводим с клавиатуры. Я пытался сделать ЯПФА, но она получилась запутанной, а как реализовать её с помощью потоков - тем более не понял. Одно дело матрицы считать, другое вот это. Очень благодарен всем кто откликнется.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2016, 07:42     Многопоточность. Посчитать выражение
Посмотрите здесь:

C++ Посчитать выражение формулой Горнера, вопрос- как?
C++ Многопоточность
C++ C++ и Многопоточность.
Многопоточность C++
Посчитать выражение через циклы while и for C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4304 / 3725 / 1255
Регистрация: 14.04.2014
Сообщений: 14,589
25.05.2016, 08:15     Многопоточность. Посчитать выражение #2
И что потоки должны делать?
isachenko
8 / 0 / 0
Регистрация: 24.05.2015
Сообщений: 5
25.05.2016, 09:31  [ТС]     Многопоточность. Посчитать выражение #3
Параллельно считать, как я понял.
akaAxeL
66 / 66 / 30
Регистрация: 14.07.2013
Сообщений: 251
25.05.2016, 10:10     Многопоточность. Посчитать выражение #4
ну тут логично создать четыре потока под подсчет факториала, можно также выделить четыре потока под степени, если считать самому а не через pow(x,n); потом синхранизируемся и получем ответ
isachenko
8 / 0 / 0
Регистрация: 24.05.2015
Сообщений: 5
25.05.2016, 10:12  [ТС]     Многопоточность. Посчитать выражение #5
как синхронизироваться, поясните, пожалуйста
nmcf
4304 / 3725 / 1255
Регистрация: 14.04.2014
Сообщений: 14,589
25.05.2016, 10:33     Многопоточность. Посчитать выражение #6
Сделай 4 по количеству групп в скобках. Тогда и функция будет одна и та же. А потом результаты соединишь.
akaAxeL
66 / 66 / 30
Регистрация: 14.07.2013
Сообщений: 251
25.05.2016, 11:22     Многопоточность. Посчитать выражение #7
Ну в плане join ждешь когда все скобки посчитаются и потом уже суммируешь
Вот простой пример
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
#include <iostream>
#include <pthread.h>
using namespace std;
 
void* factorial(void *x)
{
  int loc_x = *((int *) x);
  int fac=1;
  for(int a=1;a<=loc_x;a++)
  {
    fac=fac*a;
  }
  return (void *)fac;
}
int main()
{
  pthread_t t1,t2;
  int num1 = 4;
  int num2 = 3;
  void *status1;
  void *status2;
  pthread_create (&t1,NULL,factorial,&num1);
  pthread_create (&t2,NULL,factorial,&num2);
  pthread_join(t1,&status1);
  pthread_join(t2,&status2);
  cout << "FAC = "<< (int)status1 << endl;
  cout << "FAC = "<< (int)status2 << endl;
  return 0;
}
S_el
1908 / 1503 / 296
Регистрация: 15.12.2013
Сообщений: 5,920
25.05.2016, 12:04     Многопоточность. Посчитать выражение #8
Я бы сделал так, функцию измените сами:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <future>
#include <iostream>
#include <vector>
 
 int main() {
   std::vector<std::future<int>> futures;
 
   for(int i = 0; i < 4; ++i) {
     futures.emplace_back (std::async(
        std::launch::async,[](int a,int b){return a*b;}, i,i));
   }
 
  double r;
  for(auto &e : futures) {
    auto temp = e.get();
    std::cout << temp << std::endl;
    r +=temp;
   }
   std::cout<<r<<std::endl;
   return 0;
 }
http://ideone.com/yiAQzW
isachenko
8 / 0 / 0
Регистрация: 24.05.2015
Сообщений: 5
25.05.2016, 21:53  [ТС]     Многопоточность. Посчитать выражение #9
В общем сделал вот, работает и хорошо. Спасибо за подсказки
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
#include <thread> // потоки выполнения
#include <mutex>
#include <string>
#include <iostream>
 
using namespace std;
 
double resultf1;
double resultf2;
double resultf3;
double resultf4;
double resultf5;
mutex mtx;
void f1(const int&step, const int&x)
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
    mtx.lock();
    double stepen;
    double fact;
    stepen = 1;
    fact = 1;
    for (int i=0; i<step ; i++)
    {
        stepen = stepen * x;
    }
    for (int j=1; j<=step; j++)
    {
        
        fact = fact*j; 
    }
    resultf1 = stepen/fact;
    mtx.unlock();
}
 
void f2(const int&step, const int&x)
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
    mtx.lock();
    double stepen;
    double fact;
    stepen = 1;
    fact = 1;
    for (int i=0; i<step ; i++)
    {
        stepen = stepen * x;
    }
    for (int j=1; j<=step; j++)
    {
        fact = fact*j; 
    }
    resultf2 = stepen/fact;
    mtx.unlock();
}
void f3(const int&step, const int&x)
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
    mtx.lock();
    double stepen;
    double fact;
    stepen = 1;
    fact = 1;
    for (int i=0; i<step ; i++)
    {
        stepen = stepen * x;
    }
    for (int j=1; j<=step; j++)
    {
        fact = fact*j;  
    
    }resultf3 = stepen/fact;
    mtx.unlock();
}
void f4(const int&step, const int&x)
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
    mtx.lock();
    double stepen;
    double fact;
    stepen = 1;
    fact = 1;
    for (int i=0; i<step ; i++)
    {
        stepen = stepen * x;
    }
    for (int j=1; j<=step; j++)
    {
        fact = fact*j;  
    }
    resultf4 = stepen/fact;
    mtx.unlock();
}
void f5(const int&x)
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
    mtx.lock();
    resultf5 = x;
    mtx.unlock();
}
 
int main(int argc, char *argv[])
{
    setlocale (0, "");
    cout << "Введiть змiнну х" << endl;
    int x;
    cin >> x;
    std::thread th1(f1,3,x);
    std::thread th2(f2,5,x);
    std::thread th3(f3,7,x);
    std::thread th4(f4,9,x);
    std::thread th5(f5, x);
 
    th1.join();
    th2.join();
    th3.join();
    th4.join();
    th5.join();
 
    cout << "Робота потоку №1" << endl;
    mtx.lock();
    cout <<resultf1<<endl;
    mtx.unlock();
    cout << "Робота потоку №1 завершено" << endl;
    cout << "Робота потоку №2" << endl;
    mtx.lock();
    cout <<resultf2<<endl;
    mtx.unlock();
    cout << "Робота потоку №2 завершено" << endl;
    cout << "Робота потоку №3" << endl;
    mtx.lock();
    cout <<resultf3<<endl;
    mtx.unlock();
    cout << "Робота потоку №3 завершено" << endl;
    cout << "Робота потоку №4" << endl;
    mtx.lock();
    cout <<resultf4<<endl;
    mtx.unlock();
    cout << "Робота потоку №4 завершено" << endl;
    cout << "Робота потоку №5" << endl;
    mtx.lock();
    cout <<resultf5<<endl;
    mtx.unlock();
    cout << "Робота потоку №5 завершено" << endl;
    cout << "Робота потоку №6" << endl;
    mtx.lock();
    cout <<"x - x^3/3! + x^5/5! - x^7/7! + x^9/9! = "<<endl;
    mtx.unlock();
    
    mtx.lock();
    cout <<resultf5-resultf1+resultf2-resultf3+resultf4<<endl;
    mtx.unlock();
    cout << "Робота потоку №6 завершено" << endl;
 system ("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2016, 08:10     Многопоточность. Посчитать выражение
Еще ссылки по теме:

Многопоточность в С++ C++
C++ 11 многопоточность C++
C++ Многопоточность в C++ и C++11

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

Или воспользуйтесь поиском по форуму:
nmcf
4304 / 3725 / 1255
Регистрация: 14.04.2014
Сообщений: 14,589
26.05.2016, 08:10     Многопоточность. Посчитать выражение #10
Первые четыре функции одинаковые. Хватило бы одной с указателем на result в числе параметров.
Yandex
Объявления
26.05.2016, 08:10     Многопоточность. Посчитать выражение
Ответ Создать тему
Опции темы

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