Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
1 / 1 / 0
Регистрация: 22.05.2014
Сообщений: 31

Потоки в windows и семафоры

29.04.2015, 13:02. Показов 3652. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,помогите пожалуйста разобраться.
Задание:
Написать систему из нескольких независимых потоков,совместно решающих квадратное уравнение.Система должна состоять из:главного потока, принимающего с клавиатуры исходные данные и выводящего на экран результат;
нескольких служебных процессов или потоков, способных по отдельности выполнять элементарные арифметические действия - сложение,вычитание, умножение, деление, вычисление квадратного корня и т.п.При этом использовать способ синхронизации-Семафоры и и способ передачи данных между потоками - анонимные (неименованные) каналы.
В общем проблема в том что не могу понять как сделать несколько параллельно работающих потоков,а не последовательных как у меня.Подскажите пожалуйста.Спасибо.

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
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <WinError.h>
#include <math.h>
#include <locale.h>
#include <iostream>
 
HANDLE DThread;
HANDLE X1Thread;
HANDLE X2Thread;
HANDLE Semaphore;
HANDLE Wpipe;
HANDLE Rpipe;
DWORD b;
 
 
struct eq
{
    float a, b, c;
};
 
DWORD WINAPI Discriminant(void* P)
{
    eq q = *reinterpret_cast<eq*>(P);
    float dsk = q.b*q.b - 4 * q.a*q.c;
    WriteFile(Wpipe, &dsk, sizeof(dsk), &b, NULL);
    ReleaseSemaphore(Semaphore, 1, NULL);
    ExitThread(0);
    return 0;
}
 
DWORD WINAPI X1(void* P)
{
    eq q = *reinterpret_cast<eq*>(P);
    float x1;
    x1 = (-q.b + sqrt(q.c)) / 2 * q.a;
    printf("x1=%.3f\n", x1);
    ReleaseSemaphore(Semaphore, 1, NULL);
    ExitThread(0);
    return 0;
}
 
DWORD WINAPI X2(void* P)
{
    eq q = *reinterpret_cast<eq*>(P);
    float x2;
    x2 = (-q.b - sqrt(q.c)) / 2 * q.a;
    printf("x2=%.3f\n", x2);
    ReleaseSemaphore(Semaphore, 1, NULL);
    ExitThread(0);
    return 0;
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    eq q;
    float buf = 0;
    printf("Решение квадратного уравнения \n");
    printf("Введите a=");
    scanf_s("%f", &q.a);
    printf("Введите b=");
    scanf_s("%f", &q.b);
    printf("Введите c=");
    scanf_s("%f", &q.c);
    Semaphore = CreateSemaphore(NULL, 0, 2, NULL);
    CreatePipe(&Rpipe, &Wpipe, NULL, 0);
    DThread = CreateThread(NULL, 0, Discriminant, &q, 0, NULL);
    WaitForSingleObject(DThread, INFINITE);
    ReadFile(Rpipe, &buf, sizeof(buf), &b, NULL);
    q.c = buf;                                 
    X1Thread = CreateThread(NULL, 0, X1, &q, 0, NULL);
    WaitForSingleObject(X1Thread, INFINITE);
    X2Thread = CreateThread(NULL, 0, X2, &q, 0, NULL);
    WaitForSingleObject(X2Thread, INFINITE);
    CloseHandle(Rpipe);
    CloseHandle(Wpipe);
    CloseHandle(Semaphore);
    _getch();
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.04.2015, 13:02
Ответы с готовыми решениями:

Потоки windows
#include &lt;windows.h&gt; #include &quot;iostream&quot; #include &lt;winnt.h&gt; #include &lt;tchar.h&gt; #include &lt;cstdlib&gt; HINSTANCE hInst; int...

Процессы, потоки (windows)
Доброго времени суток! Возникла такая задача: изучить строение потоков и процессов в Windows. Есть ли какие нибудь классические...

Паралельные потоки, с++ vs Windows
Добрый день допустем есть хедер MyClass1.h в котором: class MyClass { private: void F1() void F2(); } И есть...

4
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
29.04.2015, 13:14
я, честно говоря, вообще не понимаю, что там можно параллелить в решении КвУра.
Ну да, решили, что потоки будут выполнять элементарные действия. Но так всё равно действия имеют определённый порядок.
Пока первый поток считает, например, дискриминант, второй будет ждать его результат и выполняться последовательно за первым.
0
1 / 1 / 0
Регистрация: 22.05.2014
Сообщений: 31
29.04.2015, 13:28  [ТС]
Kuzia domovenok, я тоже не понял,но препод говорит что нужно как-то разделить на параллельные,которые будут выполнять элементарные действия и зациклить их
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
29.04.2015, 15:14
Не знаю зачем вам нужны семафоры и каналы, так что прикручивайте их сами (и ради бога, используйте в качестве семафора std::mutex, а не API):
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
#include<iostream>
#include<thread>
#include<cmath>
#include<functional>
 
using namespace std;
void first_step(double a,double b,double c,double&res)
{
    res=-b+sqrt(b*b-4*a*c);
}
 
void second_step(double a,double&res)
{
    res=2*a;
}
 
int main()
{
    double a=1,b=0,c=-4,res1,res2;
    std::thread thread1(first_step,a,b,c,std::ref(res1));
    std::thread thread2(second_step,a,std::ref(res2));
    thread1.join();
    thread2.join();
    cout<<res1/res2<<endl;
    return 0;
}
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
29.04.2015, 15:34
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
я, честно говоря, вообще не понимаю, что там можно параллелить в решении КвУра.
Kuzia domovenok, если задание стоит в использовании семафоров то тут политика немного меняется. Один поток готовит данные другой их использует.
Собственно эта мысли относится и к ТС. Назначение семафоров не синхронизировать параллельные потоки (для этого есть мъютексы и критические секции), а управлять очередностью выполнения потоков. Так, что у вас все в порядке.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.04.2015, 15:34
Помогаю со студенческими работами здесь

Windows Form потоки
Подскажите пожалуйста! Почему не создается второй поток? #include &quot;MyForm.h&quot; using namespace System; using namespace...

Потоки в windows phone 8.1
на msdn есть такой пример xml-сериализации с помощью TextWriter. и вроде как написано что должно работать на Windows Phone 8.1 ...

Потоки windows, стек
1. Где физически находится стек? Почему у него фиксированный размер? Почему его переполнение опасно для программы? 2. Windows...

Потоки и Windows Forms
Здравстуйте, помогите разобраться с потоками в них я 0 лаб по программухе не было в книге не оч понятно написано... но случай такой......

Потоки в Windows Form
Всем привет! Хотелось бы понять почему при запуске кода ниже и нажатии кнопки для вызова события форма блокируется пока не отработает...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru