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

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

Войти
Регистрация
Восстановить пароль
 
slavikk07
3 / 3 / 0
Регистрация: 27.02.2013
Сообщений: 64
#1

Проход критической секции кода - C++

12.11.2013, 03:33. Просмотров 408. Ответов 8
Метки нет (Все метки)

Здравствуйте, мне нужно реализовать критическую секцию кода, которую все потоки проходят строго последовательно и поочередно. Как минимум, в критическую секцию кода нужно поместить печать сообщения - какой поток зашел в критическую секцию и подсчет числа посещений этой секции кода.

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
#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 i;
 
// главный поток
void ThreadMain(char *name)
{
    while(Count < MaxCount)
    {
        EnterCriticalSection(&CS);
 
        // критическая секция кода
        cout << "'" << name << "'" << " находится в критической секции кода\n";
        if (name == "Поток №1") i++;
        //cout << &CS;
        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 << "Завершено!" << endl;
 
    CloseHandle(hT[0]); 
    CloseHandle(hT[1]);
    CloseHandle(hT[2]);
    CloseHandle(hT[3]);
    CloseHandle(hT[4]);
 
    DeleteCriticalSection(&CS);
    return 0;
}
мне осталось сделать подсчёт сколько раз каждый поток проходить критическую секцию кода... что то я не придумаю как это реализовать ПОМОГИТЕ ПОЖАЛУЙСТА)))

Добавлено через 2 минуты
Цитата Сообщение от slavikk07 Посмотреть сообщение
if (name == "Поток №1") i++;
так не получается...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2013, 03:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проход критической секции кода (C++):

Распараллелить с помощью критической секции - C++
Здравствуйте форумчане! Дан массив от 1..n, который сортирует числа например: 1...4 2 1 3 3 вывод 1 2 3 3 Собственно...

Структуры. Вывести информацию по победителю в каждой секции и найти средний бал по каждой секции - C++
Ведомости про участников конкурса содержат следующую информацию: фамилию,имя,секцию,набранный балл.Вывести информацию по победителю в...

Найти и вывести информацию о победителе в каждой секции. Найти средний балл каждой секции. - C++
Добрый вечер, друзья) Прошу помочь с кодом, а именно с функцией search_winner. Совсем запутался, в общем нужна помощь.. Задание к...

Как отловить место критической ошибки? - C++
Добрый день. Пишу проект. Для работы использую OpenCV. Время от времени возникает критическая ошибка, как можно отловить место...

Автоматический запуск программы после критической ошибки. Как организовать? - C++
Добрый день. Есть программа, использующая OpenCV. В идеале программа должна работать без присмотра несколько часов к ряду. Однако иногда...

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

8
Vourhey
Почетный модератор
6485 / 2259 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
12.11.2013, 03:44 #2
CompareStringEx, wcsncmp/strncmp
1
Убежденный
Системный программист
Эксперт С++
15689 / 7199 / 1137
Регистрация: 02.05.2013
Сообщений: 11,634
Записей в блоге: 1
Завершенные тесты: 1
12.11.2013, 11:40 #3
...критическую секцию кода, которую все потоки проходят строго последовательно и поочередно.
В таком случае приведенный код некорректен.
1
slavikk07
3 / 3 / 0
Регистрация: 27.02.2013
Сообщений: 64
12.11.2013, 14:34  [ТС] #4
вот я переделал код с подсчётом посещений потоками кода, но как сделать что бы потоки проходили критическую секцию строго последовательно и поочередно???

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;
}
Добавлено через 38 секунд
ПОМОГИТЕ!!!=)
0
SatanaXIII
12.11.2013, 14:38
  #5

Не по теме:

Цитата Сообщение от slavikk07 Посмотреть сообщение
ПОМОГИТЕ!!!=)
Вас там клоуны убивают что ли?

0
Убежденный
Системный программист
Эксперт С++
15689 / 7199 / 1137
Регистрация: 02.05.2013
Сообщений: 11,634
Записей в блоге: 1
Завершенные тесты: 1
12.11.2013, 14:44 #6
Цитата Сообщение от slavikk07 Посмотреть сообщение
но как сделать что бы потоки проходили критическую секцию строго последовательно и поочередно???
Для таких вещей нужно писать свой планировщик потоков. Но в чем смысл создавать
несколько потоков, чтобы потом запускать их поочередно ?

Кстати, функция потока ThreadMain определена неправильно.
Она должна быть stdcall, и возвращать DWORD. Сигнатура есть в MSDN.
0
newbie666
12.11.2013, 14:44
  #7

Не по теме:

Цитата Сообщение от SatanaXIII Посмотреть сообщение
Вас там клоуны убивают что ли?

0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,533
Завершенные тесты: 1
12.11.2013, 14:47 #8
Цитата Сообщение от Убежденный Посмотреть сообщение
Для таких вещей нужно писать свой планировщик потоков. Но в чем смысл создавать
несколько потоков, чтобы потом запускать их поочередно ?
Может имелся в виду семафор?
0
Убежденный
Системный программист
Эксперт С++
15689 / 7199 / 1137
Регистрация: 02.05.2013
Сообщений: 11,634
Записей в блоге: 1
Завершенные тесты: 1
12.11.2013, 14:52 #9
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Может имелся в виду семафор?
Подозреваю, что формулировка задачи или неточная, или ошибочная.
0
12.11.2013, 14:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2013, 14:52
Привет! Вот еще темы с ответами:

Образ программы и секции - C++
Здравствуйте. Не могли бы пожалуйста объяснить подробние что такое образ программы и секции.В системном программировании

Реализация метода с private секции - C++
Добрый вечер, #pragma once #include &lt;string&gt; class Foo { private: ...

Потоки, критические секции, запись в файл - C++
Есть задание: с использованием критических секций написать функции по добавлению в список строки и поиску строки, ну и все это вывести на...

Проход по массиву - C++
Всем здравствуйте, что то я сейчас затормозил. В общем суть задачки проста найти из данного массива (действительных чисел) первое число...


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

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

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