Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
 Аватар для webber
7 / 7 / 2
Регистрация: 21.10.2012
Сообщений: 101

Синхронизации задач с несколькими потоками выполнения

16.02.2013, 22:48. Показов 3038. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание: Реализовать схему "оповещения" трех ожидающих потоков о помещении в очередь (произвольного формата) некоторого сообщения на основе объекта синхронизации "событие". Генерируют события в очередь два потока, которые имеют приоритет на уровень ниже, чем ожидающие. Посчитать среднее число обработанных каждым потоком сообщений. Очередь должна быть защищена критической секцией.

Код программы
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#include <cstdlib>
#include <iostream>
#include <windows.h>
 
using namespace std;
 
HANDLE hTimer; 
HANDLE hIEvent[1];
HANDLE hOEvent[2];
HANDLE hThread[4];  
LPDWORD lpThreadId[4];
int count, s[2];
int arr[9];
RTL_CRITICAL_SECTION * cs; 
DWORD hTimerWait;
 
void LastErrorMessage(int LastErrorCode){
    cout << "Error Code: " << LastErrorCode << endl;
    return;
}
 
DWORD InputThread1(){ 
    hTimerWait = WaitForSingleObject(hTimer, 100);
    while(hTimerWait=WAIT_TIMEOUT){
 
        WaitForMultipleObjects(3, hOEvent, FALSE, INFINITE);
        EnterCriticalSection(cs);
        if(count<11){
            count++;
            arr[count]=1;
   
            cout << "InputThread  first: " << arr[count] << endl;
        }
        LeaveCriticalSection(cs);
        SetEvent(hIEvent[1]);
    }
    return true;
}
DWORD InputThread2(){ 
    hTimerWait = WaitForSingleObject(hTimer, 100);
    while(hTimerWait=WAIT_TIMEOUT){
 
        WaitForMultipleObjects(3, hOEvent, FALSE, INFINITE);
        EnterCriticalSection(cs);
        if(count<11){
            count++;
            arr[count]=2;
   
            cout << "InputThread  first: " << arr[count] << endl;
        }
        LeaveCriticalSection(cs);
        SetEvent(hIEvent[2]);
    }
    return true;
}
DWORD OutputThread1(){ 
    hTimerWait = WaitForSingleObject(hTimer, 100);
    while(hTimerWait=WAIT_TIMEOUT){
 
        WaitForMultipleObjects(2, hOEvent, FALSE, INFINITE);
        EnterCriticalSection(cs);
        if(count>0){  
            cout << "OutputThread first: " << arr[count] << endl;
            arr[count]=0;
            count--;
            s[0]++;
        }
        LeaveCriticalSection(cs);
        SetEvent(hOEvent[1]);
    }
    return true;
}
DWORD OutputThread2(){ 
    hTimerWait = WaitForSingleObject(hTimer, 100);
    while(hTimerWait=WAIT_TIMEOUT){
 
        WaitForMultipleObjects(2, hOEvent, FALSE, INFINITE);
        EnterCriticalSection(cs);
        if(count>0){  
            cout << "OutputThread first: " << arr[count] << endl;
            arr[count]=0;
            count--;
            s[1]++;
        }
        LeaveCriticalSection(cs);
        SetEvent(hOEvent[2]);
    }
    return true;
}
DWORD OutputThread3(){ 
    hTimerWait = WaitForSingleObject(hTimer, 100);
    while(hTimerWait=WAIT_TIMEOUT){
 
        WaitForMultipleObjects(2, hOEvent, FALSE, INFINITE);
        EnterCriticalSection(cs);
        if(count>0){ 
            cout << "OutputThread first: " << arr[count] << endl;
            arr[count]=0;
            count--;
            s[2]++;
        }
        LeaveCriticalSection(cs);
        SetEvent(hOEvent[3]);
    }
    return true;
}
 
 
int main(){
    setlocale(LC_ALL, "Russian");
    
    const int   n = 3,      //число прогонов
                Time = 1,   //время работы каждого прогона
                nTimerUnitsPerSecond = 10000000;
                
    const LARGE_INTEGER *li;
    int i, y;
 
    count=0;
 
    InitializeCriticalSection(cs);
    hTimer=CreateWaitableTimer(NULL, TRUE, NULL);
    li = li-(Time * nTimerUnitsPerSecond);
  
    hIEvent[1]=CreateEvent(NULL,TRUE,FALSE, NULL);
    hIEvent[2]=CreateEvent(NULL,TRUE,FALSE, NULL);
    hOEvent[1]=CreateEvent(NULL,TRUE,TRUE, NULL);
    hOEvent[2]=CreateEvent(NULL,TRUE,TRUE, NULL);
    hOEvent[3]=CreateEvent(NULL,TRUE,TRUE, NULL);
 
    for(i=0; i=2; i++) s[i]=0;
 
    for(y=1; y=n; y++){  
        cout << "прогон №: " << y << endl;
 
        ResetEvent(hIEvent[1]);
        ResetEvent(hIEvent[2]);
        SetEvent(hOEvent[1]);
        SetEvent(hOEvent[2]);
        SetEvent(hOEvent[3]);
 
        SetWaitableTimer(hTimer, li, 0, NULL, NULL, FALSE);
 
        hThread[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)InputThread1,NULL,CREATE_SUSPENDED,lpThreadId[0]);
        if (hThread[0] == 0) LastErrorMessage( GetLastError() );
        SetThreadPriority(hThread[0],THREAD_PRIORITY_BELOW_NORMAL);
 
        hThread[1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)InputThread2,NULL,CREATE_SUSPENDED,lpThreadId[1]);
        if (hThread[1] == 0) LastErrorMessage( GetLastError() );
        SetThreadPriority(hThread[1],THREAD_PRIORITY_BELOW_NORMAL);
 
        ResumeThread(hThread[0]);
        ResumeThread(hThread[1]);
 
        hThread[2]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)OutputThread1,NULL,0,lpThreadId[2]);
        if (hThread[2] == 0) LastErrorMessage( GetLastError() );
 
        hThread[3]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)OutputThread2,NULL,0,lpThreadId[3]);
        if (hThread[3] == 0) LastErrorMessage( GetLastError() );
 
        hThread[4]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)OutputThread3,NULL,0,lpThreadId[4]);
        if (hThread[4] == 0) LastErrorMessage( GetLastError() );
 
        WaitForMultipleObjects(5,hThread,TRUE,INFINITE);
        
        for(i=0; i=4; i++) CloseHandle(hThread[i]);
    }
 
    CloseHandle(hTimer);
 
    for (i=1 ; i=2; i++)CloseHandle(hIEvent[i]);
    for (i=1 ; i=3 ;i++) CloseHandle(hOEvent[i]);
 
    DeleteCriticalSection(cs);
 
    cout << "Число обработанных сообщений: " <<endl;
 
    cout << "OutputThread first " << s[0] << endl;
    cout << "OutputThread second " << s[1] << endl;
    cout << "OutputThread third  " << s[2] << endl;
   
    cout << "Кол-во исследований: " << n << endl;
    cout << "Время исследования примерно: " << Time << " сек" << endl;
 
    cout << "Cреднее число обработанных сообщений:" << endl;
    cout << "OutputThread 1 " << s[0]/n << endl;
    cout << "OutputThread 2  " << s[1]/n << endl;
    cout << "OutputThread 3  " << s[2]/n << endl;
 
    cin.get();
    return 0;
}


При компиляции появляется следующая ошибка:

Первый этап обработки исключения в "0x7c911529" в "threads.exe": 0xC0000005: Нарушение прав доступа при записи "0x00000004".
Необработанное исключение в "0x7c911529" в "threads.exe": 0xC0000005: Нарушение прав доступа при записи "0x00000004".
Программа "[2564] threads.exe: Машинный код" завершилась с кодом 0 (0x0).
Помогите разобраться в чем может быть проблема?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.02.2013, 22:48
Ответы с готовыми решениями:

Программа синхронизации папок по сети с несколькими клиентами
Здравствуйте! Помогите,пожалуйста с задачей. Мне нужно написать программу синхронизации папок по сети с несколькими...

Работа с несколькими потоками
у меня вопрос, к тем кто работает с многопоточными приложениями у меня алгоритм такой: в основном потоке запускаю потоки в цикле ...

Выигрышь в скорости с несколькими потоками?..
Программу (связана с рассчётом) написал в двух видах: последовательном и многопоточном.. В случае с одним потокм создаётся один класс...

5
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
17.02.2013, 01:12
Цитата Сообщение от webber Посмотреть сообщение
Первый этап обработки исключения в "0x7c911529" в "threads.exe": 0xC0000005: Нарушение прав доступа при записи "0x00000004".
Необработанное исключение в "0x7c911529" в "threads.exe": 0xC0000005: Нарушение прав доступа при записи "0x00000004".
Программа "[2564] threads.exe: Машинный код" завершилась с кодом 0 (0x0).
Конкретно это проблема вызвана тем, что у вас глобальная переменная cs объявлена как не инициализированный указатель на критическую секцию (см стр. 14), а должна быть объявлена структура критической секции:
C
1
2
3
4
5
6
7
8
9
10
11
//
// ...
//
RTL_CRITICAL_SECTION cs;
//
// ...
//
InitializeCriticalSection(&cs);
//
// ...
//
Есть еще куча проблем: запустите данный код под Отладкой.
1
 Аватар для webber
7 / 7 / 2
Регистрация: 21.10.2012
Сообщений: 101
17.02.2013, 03:24  [ТС]
Спасибо, сейчас код выглядит так:
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#include <cstdlib>
#include <iostream>
#include <windows.h>
 
using namespace std;
 
HANDLE hTimer; 
HANDLE hIEvent[3];
HANDLE hOEvent[4];
HANDLE hThread[5];  
LPDWORD lpThreadId[4];
int count, s[3];
int arr[9];
RTL_CRITICAL_SECTION  cs; 
DWORD hTimerWait;
const LARGE_INTEGER *li;
 
void LastErrorMessage(int LastErrorCode){
    cout << "Error Code: " << LastErrorCode << endl;
    return;
}
 
DWORD InputThread1(){ 
    hTimerWait = WaitForSingleObject(hTimer, 100);
    while(hTimerWait=WAIT_TIMEOUT){
 
        WaitForMultipleObjects(3, hOEvent, FALSE, INFINITE);
        EnterCriticalSection(&cs);
        if(count<11){
            count++;
            arr[count]=1;
   
            cout << "InputThread  1: " << arr[count] << endl;
        }
        LeaveCriticalSection(&cs);
        SetEvent(hIEvent[1]);
    }
    return true;
}
DWORD InputThread2(){ 
    hTimerWait = WaitForSingleObject(hTimer, 100);
    while(hTimerWait=WAIT_TIMEOUT){
 
        WaitForMultipleObjects(3, hOEvent, FALSE, INFINITE);
        EnterCriticalSection(&cs);
        if(count<11){
            count++;
            arr[count]=2;
   
            cout << "InputThread  2: " << arr[count] << endl;
        }
        LeaveCriticalSection(&cs);
        SetEvent(hIEvent[2]);
    }
    return true;
}
DWORD OutputThread1(){ 
    hTimerWait = WaitForSingleObject(hTimer, 100);
    while(hTimerWait=WAIT_TIMEOUT){
 
        WaitForMultipleObjects(2, hOEvent, FALSE, INFINITE);
        EnterCriticalSection(&cs);
        if(count>0){  
            cout << "OutputThread 1: " << arr[count] << endl;
            arr[count]=0;
            count--;
            s[0]++;
        }
        LeaveCriticalSection(&cs);
        SetEvent(hOEvent[1]);
    }
    return true;
}
DWORD OutputThread2(){ 
    hTimerWait = WaitForSingleObject(hTimer, 100);
    while(hTimerWait=WAIT_TIMEOUT){
 
        WaitForMultipleObjects(2, hOEvent, FALSE, INFINITE);
        EnterCriticalSection(&cs);
        if(count>0){  
            cout << "OutputThread 2: " << arr[count] << endl;
            arr[count]=0;
            count--;
            s[1]++;
        }
        LeaveCriticalSection(&cs);
        SetEvent(hOEvent[2]);
    }
    return true;
}
DWORD OutputThread3(){ 
    hTimerWait = WaitForSingleObject(hTimer, 100);
    while(hTimerWait=WAIT_TIMEOUT){
 
        WaitForMultipleObjects(2, hOEvent, FALSE, INFINITE);
        EnterCriticalSection(&cs);
        if(count>0){ 
            cout << "OutputThread 3: " << arr[count] << endl;
            arr[count]=0;
            count--;
            s[2]++;
        }
        LeaveCriticalSection(&cs);
        SetEvent(hOEvent[3]);
    }
    return true;
}
 
 
int main(){
    setlocale(LC_ALL, "Russian");
    
    const int   n = 3,      //число прогонов
                Time = 1,   //время работы каждого прогона
                nTimerUnitsPerSecond = 10000000;
                    
    int i, y;
 
    count=0;
 
    InitializeCriticalSection(&cs);
    hTimer=CreateWaitableTimer(NULL, TRUE, NULL);
    li = li-(Time * nTimerUnitsPerSecond);
  
    hIEvent[1]=CreateEvent(NULL,TRUE,FALSE, NULL);
    hIEvent[2]=CreateEvent(NULL,TRUE,FALSE, NULL);
    hOEvent[1]=CreateEvent(NULL,TRUE,TRUE, NULL);
    hOEvent[2]=CreateEvent(NULL,TRUE,TRUE, NULL);
    hOEvent[3]=CreateEvent(NULL,TRUE,TRUE, NULL);
 
    for(i=0; i=3; i++) s[i]=0;
 
    for(y=1; y=n; y++){  
        cout << "прогон №: " << y << endl;
 
        ResetEvent(hIEvent[1]);
        ResetEvent(hIEvent[2]);
        SetEvent(hOEvent[1]);
        SetEvent(hOEvent[2]);
        SetEvent(hOEvent[3]);
 
        SetWaitableTimer(hTimer, li, 0, NULL, NULL, FALSE);
 
        hThread[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)InputThread1,NULL,CREATE_SUSPENDED,lpThreadId[0]);
        if (hThread[0] == 0) LastErrorMessage( GetLastError() );
        SetThreadPriority(hThread[0],THREAD_PRIORITY_BELOW_NORMAL);
 
        hThread[1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)InputThread2,NULL,CREATE_SUSPENDED,lpThreadId[1]);
        if (hThread[1] == 0) LastErrorMessage( GetLastError() );
        SetThreadPriority(hThread[1],THREAD_PRIORITY_BELOW_NORMAL);
 
        ResumeThread(hThread[0]);
        ResumeThread(hThread[1]);
 
        hThread[2]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)OutputThread1,NULL,0,lpThreadId[2]);
        if (hThread[2] == 0) LastErrorMessage( GetLastError() );
 
        hThread[3]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)OutputThread2,NULL,0,lpThreadId[3]);
        if (hThread[3] == 0) LastErrorMessage( GetLastError() );
 
        hThread[4]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)OutputThread3,NULL,0,lpThreadId[4]);
        if (hThread[4] == 0) LastErrorMessage( GetLastError() );
 
        WaitForMultipleObjects(5,hThread,TRUE,INFINITE);
        
        for(i=0; i=5; i++) CloseHandle(hThread[i]);
    }
 
    CloseHandle(hTimer);
 
    for (i=1 ; i=3; i++)CloseHandle(hIEvent[i]);
    for (i=1 ; i=4 ;i++) CloseHandle(hOEvent[i]);
 
    DeleteCriticalSection(&cs);
 
    cout << "Число обработанных сообщений: " <<endl;
 
    cout << "OutputThread first " << s[0] << endl;
    cout << "OutputThread second " << s[1] << endl;
    cout << "OutputThread third  " << s[2] << endl;
   
    cout << "Кол-во исследований: " << n << endl;
    cout << "Время исследования примерно: " << Time << " сек" << endl;
 
    cout << "Cреднее число обработанных сообщений:" << endl;
    cout << "OutputThread 1  " << s[0]/n << endl;
    cout << "OutputThread 2  " << s[1]/n << endl;
    cout << "OutputThread 3  " << s[2]/n << endl;
 
    cin.get();
    return 0;
}
Никаких ошибок или предупреждений по коду 10ая студия не выдает, но в консоли абсолютно пусто...
0
 Аватар для webber
7 / 7 / 2
Регистрация: 21.10.2012
Сообщений: 101
18.02.2013, 18:42  [ТС]
ап....
так и не получилось разобраться в чем проблема
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
18.02.2013, 21:26
webber, чего, Студия даже не предупреждает вот об этом:
while(hTimerWait==WAIT_TIMEOUT) в четырех местах (и дальше та же проблема с циклами, ты все время используешь присваивание вместо сравнения)? У меня GCC предупреждает...
1
 Аватар для webber
7 / 7 / 2
Регистрация: 21.10.2012
Сообщений: 101
20.02.2013, 21:52  [ТС]
сейчас программа почему то зацикливается при первом прохождении цикла
C++
1
for(y=0; y<n; y++){
133 строка;

потоки создаются и начинают отрабатывать их функции, но на этом все зацикливается, как я уже написал выше...

Код выглядит так
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#include <cstdlib>
#include <iostream>
#include <windows.h>
 
using namespace std;
 
HANDLE hTimer; 
HANDLE hIEvent[2];
HANDLE hOEvent[3];
HANDLE hThread[5];  
LPDWORD lpThreadId[5];
int count, s[3];
int arr[10];
RTL_CRITICAL_SECTION  cs; 
DWORD hTimerWait;
const LARGE_INTEGER *li;
 
void LastErrorMessage(int LastErrorCode){
    cout << "Error Code: " << LastErrorCode << endl;
    return;
}
 
DWORD InputThread1(){ 
    hTimerWait = WaitForSingleObject(hTimer, 100);
    while(hTimerWait==WAIT_TIMEOUT){
 
        WaitForMultipleObjects(3, hOEvent, FALSE, INFINITE);
        EnterCriticalSection(&cs);
        if(count<11){
            count++;
            arr[count]=1;
   
            cout << "InputThread  1: " << arr[count] << endl;
        }
        LeaveCriticalSection(&cs);
        SetEvent(hIEvent[0]);
    }
    return true;
}
DWORD InputThread2(){ 
    hTimerWait = WaitForSingleObject(hTimer, 100);
    while(hTimerWait==WAIT_TIMEOUT){
 
        WaitForMultipleObjects(3, hOEvent, FALSE, INFINITE);
        EnterCriticalSection(&cs);
        if(count<11){
            count++;
            arr[count]=2;
   
            cout << "InputThread  2: " << arr[count] << endl;
        }
        LeaveCriticalSection(&cs);
        SetEvent(hIEvent[1]);
    }
    return true;
}
DWORD OutputThread1(){ 
    hTimerWait = WaitForSingleObject(hTimer, 100);
    while(hTimerWait==WAIT_TIMEOUT){
 
        WaitForMultipleObjects(2, hOEvent, FALSE, INFINITE);
        EnterCriticalSection(&cs);
        if(count>0){  
            cout << "OutputThread 1: " << arr[count] << endl;
            arr[count]=0;
            count--;
            s[0]++;
        }
        LeaveCriticalSection(&cs);
        SetEvent(hOEvent[0]);
    }
    return true;
}
DWORD OutputThread2(){ 
    hTimerWait = WaitForSingleObject(hTimer, 100);
    while(hTimerWait==WAIT_TIMEOUT){
 
        WaitForMultipleObjects(2, hOEvent, FALSE, INFINITE);
        EnterCriticalSection(&cs);
        if(count>0){  
            cout << "OutputThread 2: " << arr[count] << endl;
            arr[count]=0;
            count--;
            s[1]++;
        }
        LeaveCriticalSection(&cs);
        SetEvent(hOEvent[1]);
    }
    return true;
}
DWORD OutputThread3(){ 
    hTimerWait = WaitForSingleObject(hTimer, 100);
    while(hTimerWait==WAIT_TIMEOUT){
 
        WaitForMultipleObjects(2, hOEvent, FALSE, INFINITE);
        EnterCriticalSection(&cs);
        if(count>0){ 
            cout << "OutputThread 3: " << arr[count] << endl;
            arr[count]=0;
            count--;
            s[2]++;
        }
        LeaveCriticalSection(&cs);
        SetEvent(hOEvent[2]);
    }
    return true;
}
 
 
int main(){
    setlocale(LC_ALL, "Russian");
    
    const int   n = 3,      //число прогонов
                Time = 1,   //время работы каждого прогона
                nTimerUnitsPerSecond = 10000000;
                    
    int i, y;
 
    count=0;
 
    InitializeCriticalSection(&cs);
    hTimer=CreateWaitableTimer(NULL, TRUE, NULL);
    li = li-(Time * nTimerUnitsPerSecond);
  
    hIEvent[0]=CreateEvent(NULL,TRUE,FALSE, NULL);
    hIEvent[1]=CreateEvent(NULL,TRUE,FALSE, NULL);
    hOEvent[0]=CreateEvent(NULL,TRUE,TRUE, NULL);
    hOEvent[1]=CreateEvent(NULL,TRUE,TRUE, NULL);
    hOEvent[2]=CreateEvent(NULL,TRUE,TRUE, NULL);
 
    for(i=0; i<3; i++) s[i]=0;
 
    for(y=0; y<n; y++){  
        cout << "прогон №: " << y << endl;
 
        ResetEvent(hIEvent[0]);
        ResetEvent(hIEvent[1]);
        SetEvent(hOEvent[0]);
        SetEvent(hOEvent[1]);
        SetEvent(hOEvent[2]);
 
        SetWaitableTimer(hTimer, li, 0, NULL, NULL, FALSE);
 
        hThread[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)InputThread1,NULL,CREATE_SUSPENDED,lpThreadId[0]);
        if (hThread[0] == 0) LastErrorMessage( GetLastError() );
        SetThreadPriority(hThread[0],THREAD_PRIORITY_BELOW_NORMAL);
 
        hThread[1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)InputThread2,NULL,CREATE_SUSPENDED,lpThreadId[1]);
        if (hThread[1] == 0) LastErrorMessage( GetLastError() );
        SetThreadPriority(hThread[1],THREAD_PRIORITY_BELOW_NORMAL);
 
        ResumeThread(hThread[0]);
        ResumeThread(hThread[1]);
 
        hThread[2]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)OutputThread1,NULL,0,lpThreadId[2]);
        if (hThread[2] == 0) LastErrorMessage( GetLastError() );
 
        hThread[3]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)OutputThread2,NULL,0,lpThreadId[3]);
        if (hThread[3] == 0) LastErrorMessage( GetLastError() );
 
        hThread[4]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)OutputThread3,NULL,0,lpThreadId[4]);
        if (hThread[4] == 0) LastErrorMessage( GetLastError() );
 
        WaitForMultipleObjects(5,hThread,TRUE,INFINITE);
        
        for(i=0; i<5; i++) CloseHandle(hThread[i]);
    }
 
    CloseHandle(hTimer);
 
    for (i=0 ; i<2; i++)CloseHandle(hIEvent[i]);
    for (i=0 ; i<3 ;i++) CloseHandle(hOEvent[i]);
 
    DeleteCriticalSection(&cs);
 
    cout << "Число обработанных сообщений: " <<endl;
 
    cout << "OutputThread first " << s[0] << endl;
    cout << "OutputThread second " << s[1] << endl;
    cout << "OutputThread third  " << s[2] << endl;
   
    cout << "Кол-во исследований: " << n << endl;
    cout << "Время исследования примерно: " << Time << " сек" << endl;
 
    cout << "Cреднее число обработанных сообщений:" << endl;
    cout << "OutputThread 1  " << s[0]/n << endl;
    cout << "OutputThread 2  " << s[1]/n << endl;
    cout << "OutputThread 3  " << s[2]/n << endl;
 
    cin.get();
    return 0;
}


Добавлено через 21 час 3 минуты
ап...(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.02.2013, 21:52
Помогаю со студенческими работами здесь

Закачка файла несколькими потоками.
Кто знает, как на Java посылать на сервер HTML-запрос на скачивание части файла? Большая просьба привести пример.

Запись в файл несколькими потоками
Помогите решить задачу Создать k потоков, которые одновременно пишут в один и тот же файл символы: ...

Обработка базы данных несколькими потоками
Пишу программу, которая обрабатывает базу данных, при том каждую строчку обрабатывает один поток. Вот код: HANDLE hThread; using...

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

Обработка одного массива несколькими потоками
Здравствуйте, имеется следующий код: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru