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

Многопоточность (вычисление корня квадратного уравнения, используя несколько независимых потоков) - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ многомерные массивы http://www.cyberforum.ru/cpp-beginners/thread261115.html
1.Даны прямоугольные матрицы А та В размерностью NхM. Вычислить элементы матрицы С по формуле 2.Дана прямоугольная матрица А размерностью NхM. Распечатать суму элементов каждого столбца и каждой...
C++ Прямая и окружность Есть прямая, заданая уравнением Ax+By+C=0 И окружность с координатами центра и радиусом Нужно найти координаты точек пересечения если таковы существуют. Находил решения, если центр окружности... http://www.cyberforum.ru/cpp-beginners/thread261101.html
Массив, расположение элементов по усовию C++
#include <cstdlib> #include <iostream> #include <cmath> #include <clocale> using namespace std; int main(int argc, char *argv) { setlocale (LC_CTYPE, "rus"); //Условие: //Преобразовать...
Файлы: отобразить список студентов с указанием среднего балла C++
Очень прошу помощи. Во входном файле размещены данные в формате: <Фамилия студента 1> <оценка 1> <оценка 2> <оценка 3> <Фамилия студента 2> <оценка 1> <оценка 2> <оценка 3> ... <Фамилия...
C++ STL. http://www.cyberforum.ru/cpp-beginners/thread261076.html
Всем доброго времени суток. У меня имеется два вопроса. 1) У нас имется квадратная матрица. И чтобы найти в строках, к примеру, максимальный элемент, мы сделаем так: *std::max_element (MAS,...
C++ чтение из файла Задача состоит в том,чтобы считать данные из файла,который содержит только целые числа со знаком,записать их в массив и вывести в консоль. // Examle(LR2).cpp : Defines the entry point for the... подробнее

Показать сообщение отдельно
boo_mago
0 / 0 / 0
Регистрация: 20.09.2010
Сообщений: 10
23.03.2011, 23:42  [ТС]
В общем, вот первая версия, не судите строго:
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#include<iostream>
#include<windows.h>
#include<process.h>
#include<math.h>
 
HANDLE hReadPipe, hWritePipe, hSemaphore;
DWORD buf, as;
using namespace std;
 
struct oper
{
    int x;
    int y;
};
DWORD WINAPI um (void* p)
{
    oper arg = *reinterpret_cast<oper*>(p);
    int num = arg.x * arg.y;
    if (!WriteFile(hWritePipe, &num, sizeof(num), &buf, NULL))
    {
        cerr<<"Error writing\n";
    }
        ReleaseSemaphore(hSemaphore, 1, NULL);
    ExitThread(0);
    return 0;
} 
DWORD WINAPI plus (void* p)
{
    oper arg = *reinterpret_cast<oper*>(p);
    int num = arg.x + arg.y;
    if (!WriteFile(hWritePipe, &num, sizeof(num), &buf, NULL))
    {
        cerr<<"Error writing\n";
    }
        ReleaseSemaphore(hSemaphore, 1, NULL);
    ExitThread(0);
    return 0;
} 
DWORD WINAPI minus (void* p)
{
    oper arg = *reinterpret_cast<oper*>(p);
    int num = arg.x - arg.y;
    if (!WriteFile(hWritePipe, &num, sizeof(num), &buf, NULL))
    {
        cerr<<"Error writing\n";
    }
        ReleaseSemaphore(hSemaphore, 1, NULL);
    ExitThread(0);
    return 0;
} 
DWORD WINAPI del (void* p)
{
    oper arg = *reinterpret_cast<oper*>(p);
    int num = arg.x/arg.y;
    if (!WriteFile(hWritePipe, &num, sizeof(num), &buf, NULL))
    {
        cerr<<"Error writing\n";
    }
    ReleaseSemaphore(hSemaphore, 1, NULL);
    ExitThread(0);
    return 0;
} 
DWORD WINAPI kor (void* p)
{
    oper arg = *reinterpret_cast<oper*>(p);
    int num = sqrt((double)arg.x);
    if (!WriteFile(hWritePipe, &num, sizeof(num), &buf, NULL))
    {
        cerr<<"Error writing\n";
    }
    ReleaseSemaphore(hSemaphore, 1, NULL);
    ExitThread(0);
    return 0;
} 
int main() 
{
    int a,b,c,res2,res1,res3,x1,x2;
    cout<<"a = ";
        cin>>a;
    cout<<"b = ";
        cin>>b;
    cout<<"c = ";
        cin>>c;
    if (!(hSemaphore=CreateSemaphore(NULL, 0, 1, NULL)))
    {
        cerr<<"Create semaphore error\n"; 
        return GetLastError();
    }
    if (!CreatePipe(&hReadPipe, &hWritePipe, NULL, 0))
    {
        cerr<<"Failed pipe creating\n"; 
        return GetLastError();
    }
    oper arg; 
    ////////////////Умножаем 4 и а//////////////////////////////////////////
    arg.x = a;
    arg.y = 4;
    CreateThread(NULL, 0, um, &arg, 0, NULL);
    WaitForSingleObject(hSemaphore, INFINITE);
    ReadFile(hReadPipe, &res2, sizeof(res2), &buf, NULL);
//  cout<<"4a="<<res2<<"\n";
    ////////////////Умножаем 4а и с////////////////////////////////////////
    arg.x = res2;
    arg.y = c;
    CreateThread(NULL, 0, um, &arg, 0, NULL);
    WaitForSingleObject(hSemaphore, INFINITE);
    ReadFile(hReadPipe, &res2, sizeof(res2), &buf, NULL);
//  cout<<"4ac="<<res2<<"\n";
    ////////////////Возводим b в квадрат//////////////////////////////////
    arg.x = b;
    arg.y = b;
    CreateThread(NULL, 0, um, &arg, 0, NULL);
    WaitForSingleObject(hSemaphore, INFINITE);
    ReadFile(hReadPipe, &res1, sizeof(res1), &buf, NULL);
//  cout<<"b2="<<res1<<"\n";
    ////////////////Вычисляем дискриминант по формуле b^2 - 4ac///////////////
    arg.x = res1;
    arg.y = res2;
    CreateThread(NULL, 0, minus, &arg, 0, NULL);
    WaitForSingleObject(hSemaphore, INFINITE);
    ReadFile(hReadPipe, &res1, sizeof(res1), &buf, NULL);
//  cout<<"D="<<res1<<"\n";
    arg.x = res1;
    arg.y = 0;
    ////////////////Проверяем дискриминант////////////////////////////////////
    if (arg.x < 0)
    {
        cout<<"D<0! Net kornei!\n";
        return 1;
    }
    ////////////////Если он положительный - вычисляем корень/////////////////////
    CreateThread(NULL, 0, kor, &arg, 0, NULL);
    WaitForSingleObject(hSemaphore, INFINITE);
    ReadFile(hReadPipe, &res1, sizeof(res1), &buf, NULL);
//  cout<<"sqrt(D)="<<res1<<"\n";
    ////////////////Подсчитываем 2а////////////////////////////////////
    arg.x = a;
    arg.y = 2;
    CreateThread(NULL, 0, um, &arg, 0, NULL);
    WaitForSingleObject(hSemaphore, INFINITE);
    ReadFile(hReadPipe, &res2, sizeof(res2), &buf, NULL);
//  cout<<"2a="<<res2<<"\n";
    ////////////////Считаем -b+sqrt(D)////////////////////////////////////
    arg.x = 0 - b;
    arg.y = res1;
    CreateThread(NULL, 0, plus, &arg, 0, NULL);
    WaitForSingleObject(hSemaphore, INFINITE);
    ReadFile(hReadPipe, &res3, sizeof(res3), &buf, NULL);
//  cout<<"-b+sqrt(D)="<<res3<<"\n";
    ////////////////Считаем -b-sqrt(D)////////////////////////////////////
    CreateThread(NULL, 0, minus, &arg, 0, NULL);
    WaitForSingleObject(hSemaphore, INFINITE);
    ReadFile(hReadPipe, &res1, sizeof(res1), &buf, NULL);
//  cout<<"-b-sqrt(D)="<<res1<<"\n";
    ////////////////Считаем корни по ф-ле (-b +- sqrt(d))/2a///////////////
    arg.x = res1;
    arg.y = res2;
    CreateThread(NULL, 0, del, &arg, 0, NULL);
    WaitForSingleObject(hSemaphore, INFINITE);
    ReadFile(hReadPipe, &x1, sizeof(x1), &buf, NULL);
    cout<<"x1 = "<<x1<<"\n";
    arg.x = res3;
    arg.y = res2;
    CreateThread(NULL, 0, del, &arg, 0, NULL);
    WaitForSingleObject(hSemaphore, INFINITE);
    ReadFile(hReadPipe, &x2, sizeof(x2), &buf, NULL);
    cout<<"x2 = "<<x2<<"\n";
    CloseHandle (hReadPipe);
    CloseHandle (hWritePipe);
    CloseHandle (hSemaphore);
    return 0;
}
Добавлено через 27 минут
Вы мне уж напишите пожалуйста, если я чего лишнего понаписал, или как-то что-то не рационально использую, я ведь только учусь

Добавлено через 9 часов 8 минут
Или не напишете? =)
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru