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

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

20.09.2017, 16:45. Показов 2126. Ответов 6

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
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <iostream>
#include <string>
#include <windows.h>
#include <process.h>
using namespace std;
 
CRITICAL_SECTION critsect;
HANDLE Print1, Print2;
 
class Queue
{
private:
    
    string * data;
    size_t size;
    size_t f_, l_;
 
public:
 
    Queue(size_t size);
 
    Queue(const Queue&) = delete;
    Queue& operator=(const Queue&) = delete;
 
    bool empty() const
    {
        return f_ == l_;
    }
 
    bool full()  const
    {
        return (l_ + 1) % size == f_;
    }
 
    string  first() const
    {
        return data[f_];
    }
    string  last()  const
    {
        return data[l_];
    }
 
    string  pop()
    {
        EnterCriticalSection(&critsect);
        string x = data[f_];
        f_ = (f_ + 1) % size;
        Sleep(100);
        LeaveCriticalSection(&critsect);
        return x;
    }
    
    bool push(string value)
    {
        EnterCriticalSection(&critsect);        
        if (full())
        {
            return false;
        }
        data[l_] = value;
        l_ = (l_ + 1) % size;
        Sleep(100);
        LeaveCriticalSection(&critsect);
        return true;
    }
    void MessageAdd()
    {
        EnterCriticalSection(&critsect);
        cout << "Произведено добавление в конец очереди." << endl;
        Sleep(1000);
        LeaveCriticalSection(&critsect);
    }
    void MessageDel()
    {       
            EnterCriticalSection(&critsect);
            cout << "Произведено удаление из очереди" << endl;
            Sleep(100);
            LeaveCriticalSection(&critsect);        
    }
    
    ~Queue()
    {
        delete[] data;
    }
};
 
Queue::Queue(size_t size) :size(size)
{
    data = new string[size];
    f_ = l_ = 0;
}
 
int main()
{   
    setlocale(LC_ALL, "");
    InitializeCriticalSection(&critsect);
    Queue q(4);
    cout << " " << endl;
    q.push("One");
    q.push("Two");
    q.push("Three");
 
    string tmp;
 
    for (int i = 0; i < 3; i++)
    {
        cin >> tmp;
        q.pop();
        q.MessageDel();
        q.push(tmp);
        q.MessageAdd();
    }
 
    while (!q.empty())
    {
        cout << q.pop() << " ";
    }
 
    DeleteCriticalSection(&critsect);
    cout << endl;
    system("pause");
    return 0;
}

Как вызвать критические секции для
Функций
q.pop();
q.MessageDel();
q.push(tmp);
q.MessageAdd();


Как уже не пытался вызвать через _beginthread, одни ошибки.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.09.2017, 16:45
Ответы с готовыми решениями:

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

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

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

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

6
413 / 148 / 48
Регистрация: 02.06.2016
Сообщений: 342
20.09.2017, 23:04 2
Лучший ответ Сообщение было отмечено HotBloode как решение

Решение

Перед строкой 59 добавьте LeaveCriticalSection(&critsect);
В MessageDel и MessageAdd критические секции не нужны.
И почему бы не сделать критическую секцию приватным полем класса. В конструкторе ее инициализируете, в деструкторе удаляете.
0
0 / 0 / 0
Регистрация: 17.03.2014
Сообщений: 86
21.09.2017, 07:44  [ТС] 3
Цитата Сообщение от GoshaM Посмотреть сообщение
Перед строкой 59 добавьте LeaveCriticalSection(&critsect);
В MessageDel и MessageAdd критические секции не нужны.
И почему бы не сделать критическую секцию приватным полем класса. В конструкторе ее инициализируете, в деструкторе удаляете.
Предположим, а если у меня функция класса с параметрами и _beginthread(q.push(tmp), 1024, NULL); ругается на параметр и вообще на скобки, то что делать?
0
1437 / 1014 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
21.09.2017, 10:38 4
Ну, если есть подозрение на говнокодсинтаксические ошибки, то оборачивай в try..exept.
Что значит "ругается"? Не проходит этап компиляции? Тогда надо код исправлять, а не плодить всякие проверки.

Добавлено через 5 минут
У меня программа норм.работает. Раздражает только немного эти бестолковые две строки...

Добавлено через 50 секунд
А так соглашусь с GoshaM - в MessageDel и MessageAdd критические секции не нужны.
0
413 / 148 / 48
Регистрация: 02.06.2016
Сообщений: 342
21.09.2017, 11:35 5
Лучший ответ Сообщение было отмечено HotBloode как решение

Решение

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
void ThreadPush(PVOID pvoid)
{
    
    Queue* pq = reinterpret_cast<Queue*>(pvoid);
    pq->push("One");
    pq->push("Two");
    ...
 
    _endthread();
}
 
void ThreadPop(PVOID pvoid)
{
 
    Queue* pq = reinterpret_cast<Queue*>(pvoid);
 
    while (!pq->empty())
    {
        cout << q->pop() << " ";
    }
    ...
 
    _endthread();
}
 
int main()
{
    ...
    Queue q(4);
    _beginthread(ThreadPush, 1024, &q);
    _beginthread(ThreadPop, 1024, &q);
    ...
}
В методах где происходит обращение к внутренним полям класса типа empty() тоже лучше применить критические секции.
0
0 / 0 / 0
Регистрация: 17.03.2014
Сообщений: 86
21.09.2017, 16:52  [ТС] 6
Цитата Сообщение от GoshaM Посмотреть сообщение
В методах где происходит обращение к внутренним полям класса типа empty() тоже лучше применить критические секции.
Спасибо большое.
Можете показать как включать и выключать критическую секцию из консоли?
Т. если я буду запускать exe из консоли и буду передавать флаг (если передаю, то будет работать критическая секция, а если нет, то не будет).
0
413 / 148 / 48
Регистрация: 02.06.2016
Сообщений: 342
25.09.2017, 08:42 7
Цитата Сообщение от HotBloode Посмотреть сообщение
Можете показать как включать и выключать критическую секцию из консоли?
Т. если я буду запускать exe из консоли и буду передавать флаг (если передаю, то будет работать критическая секция, а если нет, то не будет).
Это не эффективно, приведет к дублированию всего кода, лучше примените условную компиляцию, везде где используете критические секции.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define SECTIONON//эта строка вверху кода
...
#ifdef SECTIONON
    CRITICAL_SECTION critsect;
#endif
...
#ifdef SECTIONON
    InitializeCriticalSection(&critsect);
#endif
...
#ifdef SECTIONON
    EnterCriticalSection(&critsect); 
#endif
...
#ifdef SECTIONON
    LeaveCriticalSection(&critsect); 
#endif
...
#ifdef SECTIONON
    DeleteCriticalSection(&critsect);
#endif

Со строкой #define SECTIONON критические секции будут включены, без отключены.
0
25.09.2017, 08:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.09.2017, 08:42
Помогаю со студенческими работами здесь

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

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

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

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


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

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