Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 1
Регистрация: 23.03.2015
Сообщений: 87

Почему если n>29 происходит зависание потоков,как исправить ?

31.03.2017, 16:31. Показов 657. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
#include <windows.h>
#include <stdlib.h>
#include <time.h>
#include <dos.h>
#include <iostream>
#include <conio.h>
#include <math.h>
#define n 29
using namespace std;
class channel                               // класс каналов
{
    double *buf;                         // буфер для передачи данных
    int size;                            // размер буфера
    HANDLE s,
        empty,                               // семафоры
        full;
    int countr, countw;                  // указатели для чтения и записи
public:
    channel(int nn) : size(nn)           // конструктор
    {
        buf = new double[n];          // память для буфера
        countr = 0; countw = 0;
        s = CreateSemaphore(NULL, 1, 1, NULL); // создание семафоров
        empty = CreateSemaphore(NULL, nn,nn, NULL);
        full = CreateSemaphore(NULL, 0, nn, NULL);
    }
    void operator << (double d)              // операция записи в канал
    {
        WaitForSingleObject(empty, INFINITE);   // ожидание свободных мест
        WaitForSingleObject(s, INFINITE);
        buf[countw++] = d;                        // запись в очередь
        if (countw == size) countw = 0;
        ReleaseSemaphore(s, 1, NULL);
        ReleaseSemaphore(full, 1, NULL);          // увеличение числа запи-сей
    }
    void operator >> (double& d)          // операция чтения из канала
    {
        WaitForSingleObject(full, INFINITE); // ожидание данных
        WaitForSingleObject(s, INFINITE);
        d = buf[countr]; countr++;           // чтение из циклической очереди
        if (countr == size) countr = 0;
        ReleaseSemaphore(s, 1, NULL);
        ReleaseSemaphore(empty, 1, NULL);     // увеличение числа свободных мест
    }
};
 
channel *pc[9];
DWORD WINAPI Mult(LPVOID)         // поток для умножения
{
    int j;
    double d1, d2;
    for (j = 0; j<n; j++)              // цикл
    {
        *pc[0] >> d1; *pc[1] >> d2;    // прием данных из каналов 0 и 1
        *pc[4] << (d1*d2);           // умножение и отправление в канал 4
        //cout << "0 = " << d1 << " 1 = " << d2 << " *4: " << (d1 * d2)<<endl;
    }
    return 1;
}
DWORD WINAPI Sinus(LPVOID)        // поток для вычисления синуса
{
    int j;
    double d1;
    for (j = 0; j<n; j++)              // цикл
    {
        *pc[4] >> d1;                // прием из канала 4
        *pc[6] << sin(d1);           // передача в канал 7
        //cout << "4 = " << d1 << " sin6: " << sin(d1) << endl;
    }
    return 1;
}
 
DWORD WINAPI Sinus2(LPVOID)      // второй поток для вычисления синуса
{
    int j;
    double d1;
    for (j = 0; j<n; j++)             // цикл
    {
        *pc[5] >> d1;               // прием из канала 5
        *pc[7] << sin(d1);          // передача в канал 8
        //cout << "5 = " << d1 << " sin7: " << sin(d1) << endl;
    }
    return 1;
}
 
DWORD WINAPI Plus(LPVOID)        // поток для сложения
{
    int j;
    double d1, d2;
    for (j = 0; j<n; j++)             // цикл
    {
        *pc[2] >> d1; *pc[3] >> d2;   // прием из каналов 6 и 7
        *pc[5] << (d1 + d2);          // передача суммы в канал 9
        //cout << "2 = " << d1 <<" 3 = "<<d2<< " +5: " << (d1 + d2) << endl;
    }
    return 1;
}
DWORD WINAPI Expo(LPVOID)        // поток для вычисления экспоненты
{
    int j;
    double d1;
    for (j = 0; j<n; j++)             // цикл
    {
        *pc[7] >> d1;               // прием из канала 8
        *pc[8] << exp(d1);         // передача в канал 10
        //cout << "7 = " << d1<<" expo8: "<<exp(d1) << endl;
    }
    return 1;
}
 
void main()                      // главный поток
{
    channel c[9] = {9,9,9,9,9,9,9,9,9};
    // инициализация каналов
 
    int i;                      // каждый из них состоит из 10 элементов
    for (i = 0; i<9;i++) pc[i] = &c[i];  // указатели на каналы
    CreateThread(NULL, 0, Plus, 0, 0, 0);
    CreateThread(NULL, 0, Mult, 0, 0, 0);   // запуск потоков
    CreateThread(NULL, 0, Sinus, 0, 0, 0);
    CreateThread(NULL, 0, Sinus2, 0, 0, 0);
    CreateThread(NULL, 0, Expo, 0, 0, 0);
    double u, v, x, y;
    for (i = 0; i<n; i++)
    {
        u = i; v = i + 1;
        c[0] << u; c[1] << v;             // запись в каналы 0,1,2,3
        c[2] << u; c[3] << v;
    }
    
    for (i = 0; i<n; i++)
    {
        u = i; v = i + 1;
        c[6] >> x; c[8] >> y; cout << "\n" << i << ")  " << x; // чтение и вывод результатов
        cout << " == ";
        cout << (double)(sin(u*v)); // сравнение со значениями
        cout << " " << y << " == " << (double)(exp(sin(u+v))); // исходных формул                                                                                                                 
    }
    _getch();
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.03.2017, 16:31
Ответы с готовыми решениями:

Почему при открытии Form2 происходит зависание?
Здравствуйте! Прошу помощи экспертов, почему при открытии Form2 происходит зависание while(true) { try { var...

Почему происходит взаимная блокировка потоков?
Код из Гербердта Шилдта, глава 11, класс Deadlock // An example of deadlock. class A { synchronized void foo(B b) { String...

Почему происходит блокировка потоков в приведенном коде
Здравствуйте. Есть метод run. Создаются и запускаются 2 потока для вызова этого метода. По моему разумению потоки дойдя до первой 1000...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.03.2017, 16:31
Помогаю со студенческими работами здесь

Как исправить зависание формы?
Как исправить зависание формы Window 3? Форма должна работать пока выполняется &quot;123.exe&quot;, но она просто висит и закрывается после...

Замедление работы потоков если запущено несколько потоков
Есть отдельный поток который движет красным квадратом. Он каждую миллисекунду меняет положение квадрата на пиксель. Есть другой поток, он...

Много потоков, зависает программа. Как исправить?
Здраствуйте уважаемые знатоки. Как избавится от зависаний? У меня при помощи threads создается 100 потоков, каждый из них в любой...

Из-за чего происходит вылет? Как исправить?
По заданию из K&amp;R сделала программу вывода гистограммы длин слов: #include&lt;stdio.h&gt; #define FILLER 176 main() { ...

Зависание потоков. Работа с файлами
Всем еще раз привет. Очень прошу помощи. Пишу на С++ под винду, с учетом специфики проекта выбор остановился на boost library. Пишу...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 Слева синяя линия - количество заказов - идёт вниз, работники не справляются. Справа синяя линяя идёт вверх, потому. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru