Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 06.01.2015
Сообщений: 21
1

Критические секции в потоках

10.05.2015, 11:29. Показов 4045. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста локализовать ошибку, преподаватель говорит не верно... Если возможно подскажите пожалуйста методы или еще что то для решения проблемы.
Исходник с заданием:
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
//Создать 2 потока: поток 1, поток 2. Создать в потоке 2 критическую секцию, 
//заблокировать и вывести на экран числа от 30 до 70. В потоке 1 заблокировать секцию и 
//вывести на экран числа от 70 до 110. В главном потоке дождаться завершения потоков. 
//Удалить критическую секцию.
#include <windows.h>
#include <stdio.h>
 
HANDLE  hThread;
HANDLE  hThread2;
DWORD res;
CRITICAL_SECTION CriticalSection;
 
DWORD WINAPI thr_1(LPVOID lpParameter)
{
 
    Sleep(4600);
    printf("Vipolnyaetsya 1 potok\n");
    printf("Enter from 1\n");
    EnterCriticalSection(&CriticalSection);
    for (int i = 70; i<111; i++)
    {
        printf("%d ", i);
        Sleep(80);
    }
    printf("\n)");
 
    return 1;
}
 
DWORD WINAPI thr_2(LPVOID lpParameter)
{
    printf("Vipolnyaetsya 2 potok\n");
 
    printf("Enter from 2\n");
    EnterCriticalSection(&CriticalSection);
 
    for (int i = 30; i<71; i++)
    {
        printf("%d ", i);
        Sleep(80);
    }
    printf("\n)");
    LeaveCriticalSection(&CriticalSection);
    return 1;
}
 
int main(int argc, char** argv)
{
    // инициализируем объект-критическую секцию
    InitializeCriticalSection(&CriticalSection);
 
    hThread = CreateThread(NULL, 0, thr_1, NULL, 0, NULL);  
    CloseHandle(hThread);
    hThread2 = CreateThread(NULL, 0, thr_2, NULL, 0, NULL);
    CloseHandle(hThread2);
 
    Sleep(9000);
 
    DeleteCriticalSection(&CriticalSection);
    printf("THE END\n");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.05.2015, 11:29
Ответы с готовыми решениями:

Deadlock и критические секции
Здраствуйте, мне необходимо реализовать моделирование «тупика» на примере работы с критическими...

Критические секции в классах
Задание: Реализовать очередь текстово информации на динамическом массиве. Потоки первого типа...

Потоки. Критические секции
Не выдает результат.Считывает данные,и не выдает результат. #include &quot;stdafx.h&quot; #include...

Как работают критические секции на примерах?
Я не совсем понял,как они работают. Я понял,что это нужно для синхронизации. Я не понял,что...

2
Эксперт С++
3071 / 1409 / 425
Регистрация: 19.01.2009
Сообщений: 3,880
10.05.2015, 12:03 2
Sileighty, в thr_1 вы заходите в критическую секцию, но не освобождаете ее.
Ожидать завершения треда можно по его хендлу с помощью WaitForSingleObject.
Т.к. по заданию, критическая секция должна быть инициализирована в thr_2, поэтому скорее всего в thr_1 нужно ожидать события, что секция инициализирована, а уже после этого входить в нее, ну и соответсвенно инициализация CS перенести в thr_2.
1
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
10.05.2015, 12:19 3
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
#include <windows.h>
#include <stdio.h>
 
CRITICAL_SECTION CriticalSection;
 
DWORD WINAPI thr_1(LPVOID lpParameter)
{
    HANDLE hEvent = *((HANDLE*)lpParameter);
    WaitForSingleObject(hEvent, INFINITE);//Чтобы первый поток пошёл занимать секцию только когда она инициализируется
    EnterCriticalSection(&CriticalSection);
    printf("Vipolnyaetsya 1 potok\n");
    printf("Enter from 1\n");
    for (int i = 70; i<111; i++)
    {
        printf("%d ", i);
        Sleep(20);
    }
    printf("\n)");
    LeaveCriticalSection(&CriticalSection);
    return 1;
}
 
DWORD WINAPI thr_2(LPVOID lpParameter)
{
    HANDLE hEvent = *((HANDLE*)lpParameter);
    InitializeCriticalSection(&CriticalSection);
    EnterCriticalSection(&CriticalSection);
    SetEvent(hEvent); //выставляем событие в сигнальное состояние, первый поток ломится за секцией, а она-то уже занята этим потоком
    printf("Vipolnyaetsya 2 potok\n");
    printf("Enter from 2\n");
    for (int i = 30; i<71; i++)
    {
        printf("%d ", i);
        Sleep(20);
    }
    printf("\n)");
    LeaveCriticalSection(&CriticalSection);//освободили, тут должен заработать первый поток
    return 1;
}
 
int main(int argc, char** argv)
{
    // инициализируем объект-критическую секцию
    HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); //синхронизируем событием
    HANDLE hThreads[2];
    hThreads[0] = CreateThread(NULL, 0, thr_1, (VOID*)&hEvent, 0, NULL);//адрес его передаём в параметре
    hThreads[1] = CreateThread(NULL, 0, thr_2, (VOID*)&hEvent, 0, NULL);//и тут тоже
 
    WaitForMultipleObjects(2, hThreads, TRUE, INFINITE); //ждём когда отработают оба потока
 
    DeleteCriticalSection(&CriticalSection);
    CloseHandle(hThreads[0]);
    CloseHandle(hThreads[1]);
    CloseHandle(hEvent);
    printf("THE END\n");
    return 0;
}
1
10.05.2015, 12:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.05.2015, 12:19
Помогаю со студенческими работами здесь

Критические секции
было так: class A { someType t; public: void f1() { модификация t; } ...

Критические секции
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics,...

ThreadPool и критические секции
В классе Thread нужно было синхронизировать потоки Lock-ом, а в ThreadPool нужно использовать...

stm32f407 + критические секции
Доброго дня всем. Пишу на STM32 под freeRTOS. Наткнулся на проблему с критическими секциями....


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru