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

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

Войти
Регистрация
Восстановить пароль
 
isachenko
8 / 0 / 0
Регистрация: 24.05.2015
Сообщений: 6
#1

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

25.05.2016, 07:42. Просмотров 119. Ответов 9
Метки нет (Все метки)

Собственно, вот выражение: 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++ Посчитать сколько слов в строке начинается с буквы "т" 2. Ввести фразу. Все последовательности одинаковых символов заменить на выражение N(C)
C++ Многопоточность
Подставить в заданное выражение знаки +,-,*,/ так, чтобы выражение было истинным C++
C++ Вывести значение логического выражения, заданного в виде строки S. Выражение определяется следующим образом («T» — True, «F» — False): <выражение> :
C++ Многопоточность
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4480 / 3818 / 1288
Регистрация: 14.04.2014
Сообщений: 14,990
25.05.2016, 08:15     Многопоточность. Посчитать выражение #2
И что потоки должны делать?
isachenko
8 / 0 / 0
Регистрация: 24.05.2015
Сообщений: 6
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
Сообщений: 6
25.05.2016, 10:12  [ТС]     Многопоточность. Посчитать выражение #5
как синхронизироваться, поясните, пожалуйста
nmcf
4480 / 3818 / 1288
Регистрация: 14.04.2014
Сообщений: 14,990
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
2063 / 1570 / 301
Регистрация: 15.12.2013
Сообщений: 6,204
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
Сообщений: 6
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++
Посчитать выражение через циклы while и for C++
C++ 11 многопоточность C++
C++ Многопоточность в C++ и C++11
Многопоточность c++ C++

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

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

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