Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

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

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

25.09.2017, 08:51. Просмотров 205. Ответов 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;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2017, 08:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Переделать программу, чтобы она выполнялась без использования примитива синхронизации Mutex (C++):

Как написать программу без оформления (формы), то есть чтобы она не создавала ни одного окна, ни cmd - C++
Не для вируса)

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

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

Выручайте - переведите программу с бейсика на C++ чтобы она работала в C++ Buildere - C++ Builder
PRINT' ВЫЧИСЛЕНИЕ СТЕПЕННОГО МНОГОЧЛЕНА' INPUT' ВВЕДИТЕ СТЕПЕНЬ МНОГОЧЛЕНА N='N: DIM A(N) FOR I=N TO 0 STEP -1 PRINT!2.0!' ВВЕДИТЕ...

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

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

3
no_way
Заблокирован
28.09.2017, 14:12 #2
Атомики.
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,356
Записей в блоге: 2
Завершенные тесты: 1
28.09.2017, 18:27 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Завести свою pi для каждого потока, после join'а всех потоков сложить результаты. При таком подохе вообще никакой синхронизации не надо.
1
hoggy
6700 / 2882 / 494
Регистрация: 15.11.2014
Сообщений: 6,480
Завершенные тесты: 1
01.10.2017, 17:37 #4
1.
C++
1
std::atomic<type>
2.
C++
1
thread_local
0
01.10.2017, 17:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.10.2017, 17:37
Привет! Вот еще темы с ответами:

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

Переписать программу так, чтобы она выполнялась с динамическими массивами - Delphi
Переписать программы так, чтобы они выполнялась с динамическими массивами. 1) program odin; {$APPTYPE CONSOLE} uses SysUtils; ...

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

Переделать программу без использования функций - C++
//Vicesliti: //1.Min i Max znacenie //2.Opredeliti raznitu mejde Max i Min znaceniem //3.Opredeliti kpllicestvo znacenii ravnih cem...


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

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

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