Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
CatOnSide
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 63
1

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

02.06.2015, 15:42. Просмотров 962. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2015, 15:42
Ответы с готовыми решениями:

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

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

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

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

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

6
castaway
Эксперт С++
4938 / 3043 / 455
Регистрация: 10.11.2010
Сообщений: 11,120
Записей в блоге: 10
Завершенные тесты: 1
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
CatOnSide
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 63
02.06.2015, 16:41  [ТС] 3
Премного благдарен, только где здесь используется событие?
0
castaway
Эксперт С++
4938 / 3043 / 455
Регистрация: 10.11.2010
Сообщений: 11,120
Записей в блоге: 10
Завершенные тесты: 1
02.06.2015, 16:56 4
Тут его нет. Тебе нужно обязательно через события?
0
CatOnSide
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
castaway
Эксперт С++
4938 / 3043 / 455
Регистрация: 10.11.2010
Сообщений: 11,120
Записей в блоге: 10
Завершенные тесты: 1
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
CatOnSide
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 63
02.06.2015, 17:36  [ТС] 7
Спасибо!
0
02.06.2015, 17:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2015, 17:36

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru