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

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

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

Студворк — интернет-сервис помощи студентам
Как создать такое событие чтобы потоки входили в критическую секцию по порядку 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,170
Записей в блоге: 10
02.06.2015, 16:19
Лучший ответ Сообщение было отмечено 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  [ТС]
Премного благдарен, только где здесь используется событие?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
02.06.2015, 16:56
Тут его нет. Тебе нужно обязательно через события?
0
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 63
02.06.2015, 16:59  [ТС]
Да, вот я сделал вот так пока. По нажатию клавиши отправляю поток в секцию. Изначально программа работала так: Потоки боролись за место в критической секции, в нее пытались зайти 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,170
Записей в блоге: 10
02.06.2015, 17:24
Лучший ответ Сообщение было отмечено 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  [ТС]
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.06.2015, 17:36
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru