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

Вход потоков в критическую секцию по порядку

02.06.2015, 15:42. Показов 2330. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как создать такое событие чтобы потоки входили в критическую секцию по порядку 1,2,3,4 .....
Пока смог сделать событие чтобы они входили по нажатию клавиши, но входят рандомно.
C++ (Qt)
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
volatile int Count = 0;
const int MaxCount = 10;
HANDLE hEvent1;
HANDLE hEvent2;
int i1 = 0;
int i2 = 0;
int i3 = 0;
int i4 = 0;
int i5 = 0;
string s;
 
// главный поток
void ThreadMain(char *name)
{
    hEvent1 = CreateEvent(NULL, FALSE, TRUE, NULL);
    hEvent2 = CreateEvent(NULL, FALSE, FALSE, NULL);
    while (Count < MaxCount)
    {
            {
                if (_getch() == 's')
                WaitForSingleObject(hEvent1, INFINITE);
                SetEvent(hEvent1);
                if (WaitForSingleObject(hEvent1, FALSE))
                    break;
            }
        EnterCriticalSection(&CS);
 
        // критическая секция кода
        cout << "'" << name << "'" << " находится в критической секции кода\n";
        s = name;
        if (s == "Поток №1") i1++;
        else if (s == "Поток №2") i2++;
        else if (s == "Поток №3") i3++;
        else if (s == "Поток №4") i4++;
        else if (s == "Поток №5") i5++;
        Count++;
        Sleep(200);
 
        LeaveCriticalSection(&CS);
    }
}
 
 
// дочерний поток
HANDLE CreateChild(char *name)
{
    HANDLE hThread;
    DWORD dwId;
    hThread = CreateThread(NULL, 0,
        (LPTHREAD_START_ROUTINE)ThreadMain,
        (LPVOID)name, 0, &dwId);
    assert(hThread != NULL);
    return hThread;
}
 
 
int sec()
{
    setlocale(0, "");
    HANDLE hT[5];
    InitializeCriticalSection(&CS);
 
    cout << "Запуск, нажмите s для впуска потока в критическую секцию" << endl;
    Sleep(200);
 
    // создание дочерних потоков
    hT[0] = CreateChild("Поток №1");
    hT[1] = CreateChild("Поток №2");
    hT[2] = CreateChild("Поток №3");
    hT[3] = CreateChild("Поток №4");
    hT[4] = CreateChild("Поток №5");
 
    WaitForMultipleObjects(5, hT, TRUE, INFINITE);
    cout << "______________________________________________\n";
    cout << "Поток №1 " << "прошёл критическую секцию кода " << i1 << " раз!\n";
    cout << "Поток №2 " << "прошёл критическую секцию кода " << i2 << " раз!\n";
    cout << "Поток №3 " << "прошёл критическую секцию кода " << i3 << " раз!\n";
    cout << "Поток №4 " << "прошёл критическую секцию кода " << i4 << " раз!\n";
    cout << "Поток №5 " << "прошёл критическую секцию кода " << i5 << " раз!\n";
    cout << "Завершено!" << endl;
 
    CloseHandle(hT[0]);
    CloseHandle(hT[1]);
    CloseHandle(hT[2]);
    CloseHandle(hT[3]);
    CloseHandle(hT[4]);
 
    DeleteCriticalSection(&CS);
    system("PAUSE");
    return 0;
 
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.06.2015, 15:42
Ответы с готовыми решениями:

Написать программу с семафорами которая входит в критическую секцию
На дом задали такую домашку &quot;написать программу с семафорами которая входит в критическую секцию&quot;....

Передача указателя на критическую секцию
Уважаемые програмисты MFC и WinAPI, вопрос к вам! Есть класс наследованный от CWinThread и...

Программа вхождения и выхождения в критическую секцию..
Здравствуйте..!! Мне нужно попробовать сделать программу, которая входит в критическую секцию и...

Где нужно всунуть Критическую секцию для корректной работы
Здравствуйте, есть такая проблема, точнее я полагаю, что она там есть. В обще при создании форм я...

6
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
02.06.2015, 16:19 2
Лучший ответ Сообщение было отмечено CatOnSide как решение

Решение

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
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <iostream>
 
enum {
    num_threads = 10
};
 
static CRITICAL_SECTION g_cs;
static HANDLE           g_threads[num_threads];
 
static void thread_proc( LPVOID lpParam )
{
    int i = (int)lpParam;
    if ( i ) {
        WaitForMultipleObjects( i, g_threads, TRUE, INFINITE );
    }
    EnterCriticalSection( &g_cs );
    std::cout << i << std::endl;
    LeaveCriticalSection( &g_cs );
}
 
int main()
{
    InitializeCriticalSection( &g_cs );
    for ( size_t i = 0; i < num_threads; ++i ) {
        g_threads[i] = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)thread_proc, (LPVOID)i, 0, NULL );
    }
    WaitForMultipleObjects( num_threads, g_threads, TRUE, INFINITE );
    DeleteCriticalSection( &g_cs );
    return 0;
}
1
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 63
02.06.2015, 16:41  [ТС] 3
Премного благдарен, только где здесь используется событие?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
02.06.2015, 16:56 4
Тут его нет. Тебе нужно обязательно через события?
0
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 63
02.06.2015, 16:59  [ТС] 5
Да, вот я сделал вот так пока. По нажатию клавиши отправляю поток в секцию. Изначально программа работала так: Потоки боролись за место в критической секции, в нее пытались зайти 10 потоков, с ограничением общего числа входов, то есть получалась некая гонка. Препод сказал что хочет на защиту лабы, чтобы я использовал событие таким образом что они упорядоченно входили в крит. секцию
C++ (Qt)
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
#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <locale>
#include <conio.h>
#include <stdlib.h>
using namespace std;
 
enum {
    num_threads = 10
};
 
static CRITICAL_SECTION g_cs;
static HANDLE           g_threads[num_threads];
 
static void thread_proc(LPVOID lpParam)
{
    int i = (int)lpParam;
    if (i) {
        WaitForMultipleObjects(i, g_threads, TRUE, INFINITE);
    }
    EnterCriticalSection(&g_cs);
    std::cout << i << " вошел в критическую секцию" << endl;
    LeaveCriticalSection(&g_cs);
}
 
HANDLE hEvent1;
 
void main()
{
 
    setlocale(0, "");
    system("color F1");
    hEvent1 = CreateEvent(NULL, FALSE, TRUE, NULL);
    InitializeCriticalSection(&g_cs);
    for (size_t i = 0; i < num_threads; ++i) {
        if (_getch() == 's')
            WaitForSingleObject(hEvent1, INFINITE);
        cout << "Поток #";
        g_threads[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_proc, (LPVOID)i, 0, NULL);
    }
    WaitForMultipleObjects(num_threads, g_threads, TRUE, INFINITE);
    DeleteCriticalSection(&g_cs);
    _getch();
}
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
02.06.2015, 17:24 6
Лучший ответ Сообщение было отмечено CatOnSide как решение

Решение

Через несколько событий.
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
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <iostream>
 
enum {
    num_threads = 10
};
 
static CRITICAL_SECTION g_cs;
static HANDLE           g_events[num_threads];
static HANDLE           g_threads[num_threads];
 
static void thread_proc( LPVOID lpParam )
{
    int i = (int)lpParam;
 
    WaitForSingleObject( g_events[i], INFINITE );
 
    EnterCriticalSection( &g_cs );
    std::cout << i << std::endl;
    LeaveCriticalSection( &g_cs );
 
    if ( i < num_threads - 1 ) {
        SetEvent( g_events[i + 1] );
    }
}
 
int main()
{
    InitializeCriticalSection( &g_cs );
 
    for ( size_t i = 0; i < num_threads; ++i ) {
        g_events[i] = CreateEvent( NULL, FALSE, FALSE, NULL );
        g_threads[i] = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)thread_proc, (LPVOID)i, 0, NULL );
    }
    SetEvent( g_events[0] );
 
    WaitForMultipleObjects( num_threads, g_threads, TRUE, INFINITE );
 
    for ( size_t i = 0; i < num_threads; ++i ) {
        CloseHandle( g_events[i] );
    }
    DeleteCriticalSection( &g_cs );
    return 0;
}
1
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 63
02.06.2015, 17:36  [ТС] 7
Спасибо!
0
02.06.2015, 17:36
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.06.2015, 17:36
Помогаю со студенческими работами здесь

Алгоритм Петерсона: почему поток не может два раза подряд выполнить критическую секцию?
Друзья! Имеем два потока. Читаем: &quot;Не должно возникать неограниченно долгого ожидания для...

Реализовать критическую секцию на основе объекта синхронизации типа "событие"
Есть код, все, вреде бы логически правильно... Должно работать, но... Увы нет((( Если есть...

Получить последовательность, состоящую из слов, расставленных по порядку обратному порядку алфавита
Помогите решить задачу. Дана последовательность слов длинной N. Слова состоят из строчных...

Дано матрицу с размерами m*n, определить k-тый элемент по порядку. Элементы размещены по порядку
Дано матрицу с размерами m*n, определить k-тый элемент по порядку, если её элементы размещены по...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Информационные технологии
hw_wired 28.01.2025
Введение в современные технологии работы с информацией В современном мире информационные технологии стали неотъемлемой частью практически всех сфер человеческой деятельности. Они существенно. . .
Информация вокруг нас
hw_wired 28.01.2025
Основные понятия информации В современном мире понятие информации является фундаментальным и охватывает практически все сферы человеческой деятельности. Информация представляет собой совокупность. . .
Компьютер для начинающих
hw_wired 28.01.2025
Введение в мир компьютерных технологий В современном мире информация стала одним из важнейших ресурсов человечества, определяющим развитие общества и технологий. Наша жизнь неразрывно связана с. . .
[golang] 189. Rotate Array
alhaos 28.01.2025
Повороты рукоятки, целочисленный слайс нужно сдвинуть на целое положительное число. Мне очень нравится решение на GO / / https:/ / leetcode. com/ studyplan/ top-interview-150/ package topInterview . . .
КуМир: решение задач на матрицы
bytestream 28.01.2025
КуМир представляет собой среду для обучения программированию, которая включает в себя мощные инструменты для работы с матрицами. Матрица в программировании - это двумерный массив, состоящий из. . .
КуМир: решение задач на строки
bytestream 28.01.2025
В системе программирования КуМир работа со строковыми данными является одним из важнейших аспектов создания программ. Строки представляют собой последовательности символов, заключенные в кавычки,. . .
КуМир: решение геометрических задач
bytestream 28.01.2025
Программирование геометрических задач в среде КуМир становится всё более актуальным в обучении школьников и студентов. КуМир — это разработанная в России обучающая программная среда, предназначенная. . .
КуМир, исполнитель Водолей: Задачи и решения
bytestream 28.01.2025
КуМир — это образовательная среда для обучения программированию. Она предлагает пользователям разнообразные инструменты для разработки и отладки программ, что особенно ценно для студентов и. . .
КуМир, исполнитель Чертежник: Решение задач
bytestream 28.01.2025
КуМир (Комплект Учебных МИРов) представляет собой образовательную среду для обучения основам программирования и алгоритмизации. Исполнитель Чертежник работает на координатной плоскости, где может. . .
Rust или Go? А может C++?
hw_wired 28.01.2025
С каждой новой технологией или методологией появляются новые языки программирования, призванные решать конкретные задачи либо улучшать аспекты производительности и безопасности. Среди множества. . .
Fortran и WinAPI: как создать приложение с графическим интерфейсом
hw_wired 28.01.2025
Fortran — это один из старейших высокоуровневых языков программирования, широко используемый в науке и инженерии уже несколько десятилетий. Его название происходит от "Formula Translation" (перевод. . .
Списки в Haskell
hw_wired 28.01.2025
Haskell является функциональным языком программирования, который отличается лаконичностью синтаксиса и мощными абстракциями. Важным концептом в Haskell являются списки — упорядоченные коллекции. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru