Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
Lexa777
0 / 0 / 0
Регистрация: 10.11.2011
Сообщений: 85
#1

Потоки и критическая секция! - C++

06.12.2013, 00:43. Просмотров 3855. Ответов 1
Метки нет (Все метки)

Почему потоки проходят 14 раз, а не 10, как указано в MaxCount??????
Помогите с ответом пожалуйста!

Написать программу, главный поток которой запускает несколько дополнительных потоков. Реализовать критическую секцию кода, которую все потоки проходят. Использовать функции CreateThread, InitializeCriticalSection, DeleteCriticalSection, EnterCriticalSection, LeaveCriticalSection. Как минимум, в критическую секцию кода нужно поместить печать сообщения - какой поток зашел в критическую секцию и подсчет числа посещений этой секции кода.

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
##include <windows.h>
#include <stdlib.h>
#include <assert.h>
#include <iostream>
 
using namespace std;
 
CRITICAL_SECTION CS;  //доступ к общему ресурсу 
 
volatile int Count=0;
const int MaxCount=10;
 
int i1 = 0;
int i2 = 0;
int i3 = 0;
int i4 = 0;
int i5 = 0;
string s;
 
// главный поток
void ThreadMain(char *name)
{
    while(Count < MaxCount)
    {
        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 main(void)
{
    HANDLE hT[5];
    InitializeCriticalSection(&CS);
 
    cout << "Запуск..." << 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);
    return 0;
}
0
Миниатюры
Потоки и критическая секция!  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2013, 00:43
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Потоки и критическая секция! (C++):

Критическая секция - C++
Ребята помогите пожалуйста, надо сделать 5 потоков с помощью критической секции, незнаю как!!! пытался что-то сделать но ничего путного не...

Критическая секция не работает - C++
Значение переменной становится равно не нулю даже при наличии критических секций. Почему? #include &lt;iostream&gt; #define _AFXDLL ...

Есть ли критическая секция в стандартной библиотеке? - C++
Здравствуйте! Собственно, сам вопрос. Как использовать критическую секцию в C++? Нашёл информацию о подобном для windows и linux. Есть...

Что такое потоки ввода, потоки вывода? - C++
Здарова всем! Не так давно уже прогаю на С++ и все НИКАК не могу понять, что такое потоки ввода, потоки вывода..! вот допустим...

Критическая секция - C++
Есть процесс в нем создается 2 потока, проблема в том, что когда один из потоков находится в критической секции и если его уничтожить или...

Критическая секция - C++
Очень срочно,помогите пожалуйста,на Сях,реализовать работу бензоколонки - бензин 80,92,95,98,Дизель - разлив бензина автомобилям через...

1
EVP
488 / 256 / 43
Регистрация: 14.12.2010
Сообщений: 514
06.12.2013, 01:01 #2
Цитата Сообщение от Lexa777 Посмотреть сообщение
Почему потоки проходят 14 раз, а не 10, как указано в MaxCount??????
23 строчка необходима, но не достаточна для того, чтобы после 25-ой это условие было бы актуальным:

Кликните здесь для просмотра всего текста
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
// главный поток
void ThreadMain(char *name)
{
    while(Count < MaxCount)
    {
        EnterCriticalSection(&CS);
 
        if(Count < MaxCount)//<<-- проверка актуального значения защищённых переменных
        {
          // критическая секция кода
          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);
    }
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2013, 01:01
Привет! Вот еще темы с ответами:

Секция resource - C++
подскажите. вот у меня есть в файлах ексешных секция .rsrc только там данные размещены не последовательно.. т.е. между данными есть...

Private и public секция на одной странице памяти - C++
Здравствуйте, разве правильно, что private и public секция экземпляра класса находятся на одной странице памяти? Можно же из функции...

Критическая ошибка с <graphics.h> - C++
Подскажите если кто знает на Dev C++ графическая программа компилируется, но завершается критически : Прекращена работа программы ... ...

VC, потоки. - C++
Вот что я написал: #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;afxwin.h&gt; UINT myproc1 (LPVOID pParam) { return 0; } ...


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

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

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