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

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

12.11.2013, 03:33. Показов 1834. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.11.2013, 03:33
Ответы с готовыми решениями:

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

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

Организовать доступ к критической секции с использованием мьютекса
Для заданной группы вычислительных процессов организовать доступ к критической секции с использованием мьютекса. Желательно подробное...

8
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
12.11.2013, 03:44
CompareStringEx, wcsncmp/strncmp
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
12.11.2013, 11:40
...критическую секцию кода, которую все потоки проходят строго последовательно и поочередно.
В таком случае приведенный код некорректен.
1
3 / 3 / 0
Регистрация: 27.02.2013
Сообщений: 65
12.11.2013, 14:34  [ТС]
вот я переделал код с подсчётом посещений потоками кода, но как сделать что бы потоки проходили критическую секцию строго последовательно и поочередно???

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
12.11.2013, 14:38

Не по теме:

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

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

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

Не по теме:

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

0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
12.11.2013, 14:47
Цитата Сообщение от Убежденный Посмотреть сообщение
Для таких вещей нужно писать свой планировщик потоков. Но в чем смысл создавать
несколько потоков, чтобы потом запускать их поочередно ?
Может имелся в виду семафор?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
12.11.2013, 14:52
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Может имелся в виду семафор?
Подозреваю, что формулировка задачи или неточная, или ошибочная.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.11.2013, 14:52
Помогаю со студенческими работами здесь

Реализация критической секции при наличии только Event'a в качестве средства синхронизации
Допустим, имеется только одно средство синхронизации - Event. Помогите составить реализацию критической секции в виде класса (см. ниже)...

Использование критической секции
CriticalSection.Enter; Inc(Acc); if Acc &lt; Accounts.Count then CurAcc := Acc else Work := False; Inc(CurProxy); ...

Добавление в очередь (xQueueSend) внутри критической секции
Есть задача, которая заключается в следущем: 1. Входим в критическую секцию. 2. Изменяем некоторые глобальные переменные - для вывода...

Переделать код, чтобы вместо критической секции использовался мьютекс
Есть два потока,выводящие чётные-нечётные числа, здесь используется критическая секция,помогите,переделать программу, чтобы вместо...

Как правильно разместить секцию импорта в секции кода?
Я тут посмотрел файл masm1k.exe, это оконное приложение, весом в 1 кб (!). У него отсутствует секция импорта, её как-то запихали в...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru