Форум программистов, компьютерный форум 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"); //Условие: //Преобразовать массив таким образом, что бы сначала располагались все элементы, //отличающиеся от максимального не болеее чем на 20%, а потом - все остальные.
Файлы: отобразить список студентов с указанием среднего балла C++
Очень прошу помощи. Во входном файле размещены данные в формате: <Фамилия студента 1> <оценка 1> <оценка 2> <оценка 3> <Фамилия студента 2> <оценка 1> <оценка 2> <оценка 3> ... <Фамилия студента N> <оценка 1> <оценка 2> <оценка 3> <пустая строка> Отобразить список студентов с указанием среднего балла для каждого из них.
C++ STL. http://www.cyberforum.ru/cpp-beginners/thread261076.html
Всем доброго времени суток. У меня имеется два вопроса. 1) У нас имется квадратная матрица. И чтобы найти в строках, к примеру, максимальный элемент, мы сделаем так: *std::max_element (MAS, MAS+SIZE); А как с помощью тех же алгоритмов, искать максимумы в столбцах? 2) Представим, что мы на олимпиаде. Что предпочтительнее делать, пользоваться STL или описывать все руками?
C++ чтение из файла Задача состоит в том,чтобы считать данные из файла,который содержит только целые числа со знаком,записать их в массив и вывести в консоль. // Examle(LR2).cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "fstream" #include "iomanip" #include "iostream" подробнее

Показать сообщение отдельно
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 минут
Или не напишете? =)
 
Текущее время: 23:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru