Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
41 / 22 / 12
Регистрация: 07.12.2011
Сообщений: 114
1

Критическая секция и внешний элемент

16.11.2012, 01:00. Показов 708. Ответов 5
Метки нет (Все метки)

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
#include<iostream>
#include<windows.h>
using namespace std;
 
struct zayavka
{
    int num1;
    int num2;
    int res;
    int oper;//1=сложение,2=вычитание,3=умножение,4=делениею
    int time;
    int id;
    int sost;//0=ожидание,1=выполнение,3=готова.
};
 
class SERVER
{
  public:
    zayavka *irr;
    int i,j;
 
    SERVER(){i=0;j=0;}
    void generation();
    void show();
};
 
int kol, agent;
SERVER server;
CRITICAL_SECTION csS;
 
void generation()
{
    int t=0;
    while(server.i<kol)
    {
        EnterCriticalSection(&csS);
        t=server.i;
        server.i=server.i+1;
        LeaveCriticalSection(&csS);
        server.irr[t].id=t;
        server.irr[t].num1=rand()%1001-0;
        server.irr[t].num2=rand()%101-0;
        server.irr[t].oper=rand()%4-1;
        server.irr[t].res=0;
        server.irr[t].sost=0;
        server.irr[t].time=rand()%401-100;
    }
}
 
void show()
{   
    for(int n=0;n<kol;n++)
    {   cout<<"Заявка №"<<server.irr[n].id+1<<'\n';
    cout<<server.irr[n].num1;
    if(server.irr[n].oper==1)
        cout<<"+";
    else if(server.irr[n].oper==2)
        cout<<"-";
    else if(server.irr[n].oper==3)
        cout<<"*";
    else 
        cout<<"/";
    cout<<server.irr[n].num2<<"="<<server.irr[n].res<<'\n';
    cout<<"Состояние: ";
    if(server.irr[n].sost==1)
        cout<<"Ожидание";
    else if (server.irr[n].sost==2)
        cout<<"Выполнение";
    else
        cout<<"Готова";
 
    }
}
 
int main()
{   
    setlocale(LC_ALL, "Russian");
   cout<<"Введите количество заявок: ";
   cin>>kol;
   cout<<"Введите количество агентов: ";
   cin>>agent;
 
    InitializeCriticalSection(&csS);
    HANDLE *g = new HANDLE[1];
    g[0] = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)generation, 0, 0, 0);
    DeleteCriticalSection(&csS);
    server.show();
    system("pause");
}
и это только начало, пишет ошибку функции show что есть один неразрешенный внешний элемент. Если функцию Show убираю то пишет невозможно вычислить значения и показывает ошибку критической секции и дальше по списку.

что надо: пока сгенерировать с помощью потока количество заявок и заполнить их поля.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.11.2012, 01:00
Ответы с готовыми решениями:

Критическая секция
такая задача. есть глобальный указатель на структуру. в main -е динамически выделяю память под...

Критическая секция
Требуется применить критическую секцию для процессов через разделяемую память. Ниже привел участок...

Критическая секция и семафоры
Посмотрите пожалуйста правильно ли я сделал программу. Нужно было написать программу, в которой при...

Не работает критическая секция
Почему-то значение переменной становится равно не нулю даже при наличии критических секций. Почему?...

5
240 / 213 / 84
Регистрация: 18.03.2010
Сообщений: 750
16.11.2012, 02:16 2
1. потоковая функция не может быть методом класса. (если она имеется в виду)
2. определение методов класса делается так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
void SERVER::generation()
{
    ...
}
 
void SERVER::show()
{   
    ...
}
3. какой смысл в создании критической секции, если после старта потока она сразу же удаляется?
1
41 / 22 / 12
Регистрация: 07.12.2011
Сообщений: 114
16.11.2012, 22:14  [ТС] 3
ой как тут наглупил( спасибо)

Добавлено через 16 минут
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
#include<iostream>
#include<windows.h>
using namespace std;
 
struct zayavka
{
    int num1;
    int num2;
    int res;
    int oper;//1=сложение,2=вычитание,3=умножение,4=делениею
    int time;
    int id;
    int sost;//0=ожидание,1=выполнение,3=готова.
};
 
class SERVER
{   
public:
    zayavka *irr;
    int i,j;
 
    //SERVER(){i=j=0;}; если генерируем потоком
    SERVER();
 
    void vvod();
    void show();
 
};
 
int kol, agent;
SERVER server;
CRITICAL_SECTION csS;
 
void SERVER::vvod()
{
   cout<<"Введите количество заявок: ";
   cin>>kol;
   cout<<"Введите количество агентов: ";
   cin>>agent;
}
 
SERVER::SERVER()
{
    irr= new zayavka[kol];
    i=j=0;
    int t=0;
    while(i<kol)
    {   
        EnterCriticalSection(&csS);
        t=i;
        i++;
        LeaveCriticalSection(&csS);
        irr[t].id=t;
        irr[t].num1=rand()%1001-0;
        irr[t].num2=rand()%101-0;
        irr[t].oper=rand()%4-1;
        irr[t].res=0;
        irr[t].sost=0;
        irr[t].time=rand()%401-100;
    }
}
 
void SERVER::show()
{   
    for(int n=0;n<kol;n++)
    {   
    cout<<"Заявка №"<<irr[n].id+1<<'\n';
    cout<<irr[n].num1;
    if(irr[n].oper==1)
        cout<<"+";
    else if(irr[n].oper==2)
        cout<<"-";
    else if(irr[n].oper==3)
        cout<<"*";
    else 
        cout<<"/";
    cout<<irr[n].num2<<"="<<irr[n].res<<'\n';
    cout<<"Состояние: ";
    if(irr[n].sost==1)
        cout<<"Ожидание";
    else if (irr[n].sost==2)
        cout<<"Выполнение";
    else
        cout<<"Готова";
 
    }
}
 
int main()
{   
    setlocale(LC_ALL, "Russian");
    InitializeCriticalSection(&csS);
    server.vvod();
    server.show();
    system("pause");
}
Добавлено через 14 секунд
плохо выводит, неккоректно(
0
240 / 213 / 84
Регистрация: 18.03.2010
Сообщений: 750
17.11.2012, 23:21 4
Цитата Сообщение от pavlovnik Посмотреть сообщение
плохо выводит, неккоректно(
pavlovnik, в код сильно не вникал, но сразу скажу, конструктор класса SERVER выполнится ещё до первого оператора в main(), следовательно память (в не определенном размере) выделится до того как выполнится функция vvod. Кстати, вход в критическую секцию тоже выполнится раньше чем её инициализация.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
18.11.2012, 00:04 5
Цитата Сообщение от jonson Посмотреть сообщение
1. потоковая функция не может быть методом класса. (если она имеется в виду)
Это почему же?
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
#include <windows.h>
#include <iostream>
 
using namespace std;
 
class A {
    HANDLE  m_thread;
 
public:
    static DWORD WINAPI thread_proc( LPVOID lpParameter ) {
        cout << "hello!\n";
        return 0;
    }
 
    A() {
        m_thread = CreateThread( NULL, 0, thread_proc, NULL, 0, NULL );
    }
 
    ~A() {
        WaitForSingleObject( m_thread, INFINITE );
    }
};
 
int main()
{
    A   a;
    return 0;
}
1
41 / 22 / 12
Регистрация: 07.12.2011
Сообщений: 114
19.11.2012, 23:56  [ТС] 6
я решил что работая с классом сервер могут возникнуть трудности и с обработчиком, число кода увеличится многократно. решил просто написать ту задачу, просто так, без классов. в этой теме Поток не запускается

помогите там разобраться что не так, чтобы она работала. а с классами я наверное займусь когда сдам эту преподавателю)
0
19.11.2012, 23:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.11.2012, 23:56
Помогаю со студенческими работами здесь

Критическая секция (флаги готовности)
Есть ли какие-нибудь примеры программ на С++ или C# (в крайнем случае на С) на алгоритм флаги...

Не удается правильно синхронизировать потоки, критическая секция
доброго времени суток. необходимо синхронизировать n = 2,4,8,16 потоков чтения записи...

Можно ли узнать, когда критическая секция будет захвачена?
Здравствуйте. Желаемый алгоритм: 1. Подождать, пока поток попытается захватить (или же...

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


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

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