Форуму привет. Сейчас я расскажу как писать правильно писать асинхронные приложения под Windows.
Примером у нас будет такая задача: нам нужно сделать выполнение цикла в нескольких потоках, и при достижении определённого
количества итераций остановить потоки, незнающий человек напишет примерно такой код:
Но ошибка тут в.... value++
Суть в том, что value++ это набор асм инструкций, а что будет если из-за того, что это мультитред эти инстуркции выполнятся по очереди.
Значение будет уже не достоверным, для этого есть атомарные Interlocked функции, в нашем случаее нам нужна InterlockedExchange
Правильная версия кода:
А вообще написание качевственного асинхронного софта очень сложное занятие.
Примером у нас будет такая задача: нам нужно сделать выполнение цикла в нескольких потоках, и при достижении определённого
количества итераций остановить потоки, незнающий человек напишет примерно такой код:
C++:
#include <windows.h>
#include <shlwapi.h>
int value = 0;
void worker() {
while (1) {
//do something
value+=10;
}
}
int main() {
HANDLE hThreads[4];
for (int i = 0; i < 4; i++) {
hThreads[i] = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)worker, 0, 0, 0);
}
while (1) if (value >= 1000) for (int i = 0; i < 4; i++) TerminateThread(hThreads[i], 0);
}
Но ошибка тут в.... value++
Суть в том, что value++ это набор асм инструкций, а что будет если из-за того, что это мультитред эти инстуркции выполнятся по очереди.
Значение будет уже не достоверным, для этого есть атомарные Interlocked функции, в нашем случаее нам нужна InterlockedExchange
Правильная версия кода:
C++:
#include <windows.h>
#include <shlwapi.h>
volatile ULONGLONG value = 0;//volatile - флаг который говорит компилятору что переменную не нужно оптимизировать
void worker() {
while (1) {
//do something
InterlockedExchange(&value, 10);
//1 это значение на изменение, если там было-бы -1 то получился бы декримент
}
}
int main() {
HANDLE hThreads[4];
for (int i = 0; i < 4; i++) {
hThreads[i] = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)worker, 0, 0, 0);
}
while (1) if (value >= 1000) for (int i = 0; i < 4; i++) TerminateThread(hThreads[i], 0);
}
А вообще написание качевственного асинхронного софта очень сложное занятие.
Последнее редактирование: