Здравствуйте, Плутон!
Один из вариантов - в приложении. Используются функции Win API. Собственно, там особо ничего сложного нет: для каждого потока создаётся его личный ящик для данных, а главный поток создаёт ящик для результатов и запускает все остальные потоки.
Проверялось на Visual Studio, вроде всё нормально считает. Если что-то не так поняла, или упустила, или есть ещё какие-то вопросы - в мини-форум.
Несколько ссылок о почтовых ящиках:
Википедия,
MSDN.
Удачи!
Приложение:
#include <Windows.h>
#include <math.h>
#include <iostream>
#include <WinError.h>
using namespace std;
double Func (char c) //функция для арифметических действий
{
HANDLE Mailslot, ms1;
DWORD n;
double x, y, z;
char name [256];
sprintf (name, "\\\\.\\Mailslot\\slot%i", c);
ms1 = CreateFile( "\\\\.\\Mailslot\\slotres", GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); //открываем ящик для результата
if ((Mailslot = CreateMailslot(name, 0, MAILSLOT_WAIT_FOREVER, NULL)) == INVALID_HANDLE_VALUE) //создаём ящик для операндов
{
printf("Ошибка при создании ПЯ %d\n", GetLastError());
getchar();
return 0;
}
while (true) {
if (ReadFile(Mailslot, (LPVOID)&x, sizeof(x), &n, NULL)!= 0) //получаем первый операнд
{
switch (c) { //выбираем операцию
case '+':
ReadFile(Mailslot, (LPVOID)&y, sizeof(y), &n, NULL); //при бинарной - читаем второй операнд
z = x + y;
break;
case '-':
ReadFile(Mailslot, (LPVOID)&y, sizeof(y), &n, NULL);
z = x - y;
break;
case '*':
ReadFile(Mailslot, (LPVOID)&y, sizeof(y), &n, NULL);
z = x * y;
break;
case '/':
ReadFile(Mailslot, (LPVOID)&y, sizeof(y), &n, NULL);
if (y!=0) z = x / y;
else z = 0;
break;
case '2':
z = x * x;
break;
case '^':
if (x >= 0) z = sqrt(x);
else z = 0;
break;
}
if (WriteFile(ms1, (LPVOID)&z, sizeof(z), &n, NULL) == 0) //пишем результат
{
printf("Ошибка отправки %d\n", GetLastError());
} else {
printf ("Результат отправлен");
}
}
}
}
DWORD WINAPI AddThread(void *pParam) //поток сложение
{
Func ('+');
return 0;
}
DWORD WINAPI MinusThread(void *pParam) //поток вычитание
{
Func ('-');
return 0;
}
DWORD WINAPI MultThread(void *pParam) //поток умножение
{
Func ('*');
return 0;
}
DWORD WINAPI DivThread(void *pParam) //поток деление
{
Func ('/');
return 0;
}
DWORD WINAPI SqrThread(void *pParam) //поток квадрат
{
Func ('2');
return 0;
}
DWORD WINAPI SqrtThread(void *pParam) //поток корень
{
Func ('^');
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
setlocale (LC_ALL, "russian");
DWORD dwID;
HANDLE ms1, ms2, ms3, ms4, ms5, ms6, res;
if ((res = CreateMailslot("\\\\.\\Mailslot\\slotres", 0, MAILSLOT_WAIT_FOREVER, NULL)) == INVALID_HANDLE_VALUE) //создаём ящик для приёма результатов
{
printf("Ошибка при создании ПЯ %d\n", GetLastError());
getchar();
return 0;
}
CloseHandle (CreateThread(NULL, 0, AddThread, NULL, 0, &dwID)); //Создаём поток
CloseHandle (CreateThread(NULL, 0, MinusThread, NULL, 0, &dwID)); //Создаём поток
CloseHandle (CreateThread(NULL, 0, MultThread, NULL, 0, &dwID)); //Создаём поток
CloseHandle (CreateThread(NULL, 0, DivThread, NULL, 0, &dwID)); //Создаём поток
CloseHandle (CreateThread(NULL, 0, SqrThread, NULL, 0, &dwID)); //Создаём поток
CloseHandle (CreateThread(NULL, 0, SqrtThread, NULL, 0, &dwID)); //Создаём поток
cout << "Введите числа: ";
double x[3], t, t1, s = 3;
cin >> x[0] >> x[1] >> x[2];
DWORD n;
char name [256];
sprintf (name, "\\\\.\\Mailslot\\slot%i", '+');
if ((ms1 = CreateFile(name, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL))==INVALID_HANDLE_VALUE)
{
printf("Ошибка открытия слота %d\n", GetLastError());
getchar();
return 0;
}
if (WriteFile(ms1, (LPVOID)&x[0], sizeof(double), &n, NULL) == 0 || WriteFile(ms1, (LPVOID)&x[1], sizeof(double), &n, NULL) == 0)
{
printf("Ошибка отправки %d\n", GetLastError());
getchar ();
return 0;
}
if (ReadFile(res, (LPVOID)&t, sizeof(t), &n, NULL) != 0) {
if (WriteFile(ms1, (LPVOID)&t, sizeof(t), &n, NULL) == 0 || WriteFile(ms1, (LPVOID)&x[2], sizeof(double), &n, NULL) == 0)
{
printf("Ошибка отправки %d\n", GetLastError());
getchar ();
return 0;
}
}
ReadFile(res, (LPVOID)&t, sizeof(t), &n, NULL);
sprintf (name, "\\\\.\\Mailslot\\slot%i", '/');
ms2 = CreateFile(name, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(ms2, (LPVOID)&t, sizeof(t), &n, NULL);
WriteFile(ms2, (LPVOID)&s, sizeof(s), &n, NULL);
ReadFile(res, (LPVOID)&t, sizeof(t), &n, NULL);
sprintf (name, "\\\\.\\Mailslot\\slot%i", '-');
ms3 = CreateFile(name, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
sprintf (name, "\\\\.\\Mailslot\\slot%i", '2');
ms4 = CreateFile(name, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
double sm = 0;
for (int i=0; i<s; i++)
{
WriteFile(ms3, (LPVOID)&t, sizeof(t), &n, NULL);
WriteFile(ms3, (LPVOID)&x[i], sizeof(double), &n, NULL);
ReadFile(res, (LPVOID)&t1, sizeof(t1), &n, NULL);
WriteFile(ms4, (LPVOID)&t1, sizeof(t1), &n, NULL);
ReadFile(res, (LPVOID)&t1, sizeof(t1), &n, NULL);
sm+=t1;
}
WriteFile(ms2, (LPVOID)&sm, sizeof(sm), &n, NULL);
WriteFile(ms2, (LPVOID)&s, sizeof(s), &n, NULL);
ReadFile(res, (LPVOID)&t1, sizeof(t1), &n, NULL);
cout << "Дисперсия: " << t1;
sprintf (name, "\\\\.\\Mailslot\\slot%i", '^');
ms5 = CreateFile(name, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(ms5, (LPVOID)&t1, sizeof(t1), &n, NULL);
ReadFile(res, (LPVOID)&t, sizeof(t), &n, NULL);
cout << "Корень: " << t;
getchar ();
CloseHandle (ms1);
CloseHandle (ms2);
CloseHandle (ms3);
CloseHandle (ms4);
CloseHandle (ms5);
CloseHandle (res);
return 0;
}