Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
Whenifeellonely
0 / 0 / 0
Регистрация: 28.10.2016
Сообщений: 1
#1

Переделать программу, чтобы она выполнялась без использования примитива синхронизации Mutex - C++

25.09.2017, 08:51. Просмотров 239. Ответов 3

Необходимо переделать программу так, чтобы она выполнялась без использования примитива синхронизации Mutex. Есть идеи? Буду рад любой помощи.


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
#include <iostream>
#include <mutex>
#include <thread>
#include <iomanip>
#include <cmath>
 
 
using namespace std; 
 
const double pi0 = 3.141592653589793238462643;
volatile double pi = 0.0;
mutex m;
long intervals = 50000000;
int numThreads=2;
long t1,t2;
 
void computePi(int num)
{
    double x, width, localSum = 0.0;
    width = 1.0/intervals;
    for(int i=num; i<intervals; i+=numThreads)
    {
        x = (i+0.5)*width;
        
        localSum += 4.0/(1.0 + x*x);
  }
  localSum *= width;
  
    m.lock();
    pi += localSum;
    m.unlock();
}
void computePi1()
{
    double x, width;
    width = 1.0/intervals;
    for(int i=0; i<intervals; i++)
    {
        x = (i+0.5)*width;
        pi += 4.0/(1.0 + x*x);
  }
  pi *= width;
}
 
void computePi2(int num)
{
    double f, localSum = 0;
    for(int i = num; i < intervals; i+=numThreads)
       {
          if(i%2 == 0) f = 1.0;
          else f = -1.0;
          localSum += f/(2*i+1);
       }
    m.lock();
    pi += 4*localSum;
    m.unlock();
}
 
void computePi3()
{
    double f, localSum = 0;
    for(int i = 0; i < intervals; i++)
       {
          if(i%2 == 0) f = 1.0;
          else f = -1.0;
          localSum += f/(2*i+1);
       }
    
    pi = 4*localSum;
    
}
 
int main()
{
  thread th[numThreads];
  t1 = clock();
    for(int i = 0; i < numThreads; i++)
       th[i] = thread(computePi,i);
 
  for(int i = 0; i< numThreads; i++)
     th[i].join();
    t2 = clock();       
 cout << setprecision(16) << pi << endl;
 cout << setprecision(4) << "err: " << fabs(pi0 - pi) << endl;
 cout << "time: " << t2-t1 << endl; 
 pi = 0.0;
 t1 = clock();
 computePi1();
 t2 = clock();
 cout << setprecision(16) << pi << endl;
 cout << setprecision(4) << "err: " << fabs(pi0 - pi) << endl;
 cout << "time: " << t2-t1 << endl; 
 pi = 0.0;
 t1 = clock();
    for(int i = 0; i < numThreads; i++)
       th[i] = thread(computePi2,i);
 
  for(int i = 0; i< numThreads; i++)
     th[i].join();
    t2 = clock();   
    cout << setprecision(16) << pi << endl;
 cout << setprecision(4) << "err: " << fabs(pi0 - pi) << endl;
 cout << "time: " << t2-t1 << endl; 
 
 pi = 0;
 t1 = clock();
 computePi3();
 t2 = clock();
 cout << setprecision(16) << pi << endl;
 cout << setprecision(4) << "err: " << fabs(pi0 - pi) << endl;
 cout << "time: " << t2-t1 << endl; 
 return 0;
}

http://www.cyberforum.ru/cpp/thread449140.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2017, 08:51
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Переделать программу, чтобы она выполнялась без использования примитива синхронизации Mutex (C++):

Забиндить функцию с параметрами, чтобы она хранилась в классе и вызывалась без placeholders
Значит привет всем. Суть в кратце: хочу забиндить функцию с параметрами...

Как составить программу учета без использования базы данных?
Пожалуйста помогите новичку. Надо составить программу без использование базы...

Выручайте - переведите программу с бейсика на C++ чтобы она работала в C++ Buildere
PRINT' ВЫЧИСЛЕНИЕ СТЕПЕННОГО МНОГОЧЛЕНА' INPUT' ВВЕДИТЕ СТЕПЕНЬ МНОГОЧЛЕНА...

Как усложнить программу, чтобы она по переполнению буфера не зависала, а выполняла какое-нибудь действие
Вечер добрый. Ребята, подскажите пожалуйста, как мне усложнить программу, что...

Как переделать эту программу, чтобы она выполнялась через функцию?
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int main() {...

3
no_way
Заблокирован
28.09.2017, 14:12 #2
Атомики.
0
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 340
Регистрация: 12.12.2009
Сообщений: 7,523
Записей в блоге: 2
Завершенные тесты: 1
28.09.2017, 18:27 #3
Лучший ответ Сообщение было отмечено MrGluck как решение

Решение

Завести свою pi для каждого потока, после join'а всех потоков сложить результаты. При таком подохе вообще никакой синхронизации не надо.
1
hoggy
Заблокирован
01.10.2017, 17:37 #4
1.
C++
1
std::atomic<type>
2.
C++
1
thread_local
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.10.2017, 17:37
Привет! Вот еще темы с решениями:

Как переделать эту программу, чтобы она выполнялась через функцию?
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int...

Переписать программу так, чтобы она выполнялась с динамическими массивами
Переписать программы так, чтобы они выполнялась с динамическими массивами. ...

Переделать программу, чтобы она работала без каналов, а только с сигналами. Оплата 300 рублей
Здравствуйте, нужно переделать программу, чтобы она работала без каналов, а...

Переделать программу,чтобы она заработала
код с# using System; using System.Collections.Generic; using System.Linq;...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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