Подруга попросила помочь с лабой. Суть такова :
при нажатии "1" первая переменная ++. при нажатии "2" вторая переменная ++.
Теже самые действия должны происходить и в потоках, но с задержкой. Для чего и используются функции атомизированные. Но почему-то все равно идет асинхронизация. Мне кажется это из-за задержки, т.к атомизированные функции прервать нельзя, а вот во время задержки - делай что хочешь... как можно побороть?
//InterlockedIncrement #include <windows.h> #include <iostream> #include <time.h> #include <conio.h> using namespace std; HANDLE thread1; HANDLE thread2; DWORD id1; DWORD id2; struct log; DWORD thread_proc1(log* p); DWORD thread_proc2(log* p); struct log { int nom; int key; DWORD ID; clock_t t1; clock_t t2; LONG F1; LONG F2; LONG Fc1; LONG Fc2; } mylog[1000]; int F1 = 0; int F2 = 0; clock_t wait = 100; void waiting(clock_t dt); int main() { int i = 0, j = 0; int flag = 1; int key; LONG Fclone1 = F1, Fclone2 = F2; mylog[i].t2 = 0; while (flag) { if (kbhit() != 0) { key = getch(); switch (key) { case 27: { flag = 0; break; } case 49: { Fclone1++; break; } case 50: { Fclone2++; break; } } if (key == 49) { mylog[i].nom = i + 1; mylog[i].key = key; mylog[i].t2 = 0; mylog[i].Fc1 = Fclone1; mylog[i].Fc2 = Fclone2; mylog[i].t1 = clock(); thread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) thread_proc1, &mylog[i], CREATE_SUSPENDED, &id1); if (thread1 == NULL) { cout << "Thread error at key " << key << endl; getch(); return -1; } else { mylog[i].ID = id1; ResumeThread(thread1); i++; } } if (key == 50) { mylog[i].nom = i + 1; mylog[i].key = key; mylog[i].t2 = 0; mylog[i].Fc1 = Fclone1; mylog[i].Fc2 = Fclone2; mylog[i].t1 = clock(); thread2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) thread_proc2, &mylog[i], CREATE_SUSPENDED, &id2); if (thread2 == NULL) { cout << "Thread error at key " << key << endl; getch(); return -1; } else { mylog[i].ID = id2; ResumeThread(thread2); i++; } } } if (mylog[j].t2 != 0) { cout << j + 1 << '\t' << mylog[j].key << '\t' << mylog[j].ID << '\t' << mylog[j].t1 << '\t' << mylog[j].t2 << '\t' << mylog[j].F1 << '\t' << mylog[j].F2 << '\t' << mylog[j].Fc1 << '\t' << mylog[j].Fc2 << endl; j++; } } getch(); return 0; } DWORD thread_proc1(log* p) { LONG Fb1, Fb2; InterlockedExchange(&Fb1, F1); InterlockedExchange(&Fb2, F2); waiting(wait); InterlockedIncrement(&Fb1); InterlockedExchange((long*)&F1, Fb1); InterlockedExchange((long*)&F2, Fb2); InterlockedExchange(&(p->F1), F1); InterlockedExchange(&(p->F2), F2); p->t2 = clock(); return 0; } DWORD thread_proc2(log* p) { LONG Fb1, Fb2; InterlockedExchange(&Fb1, F1); InterlockedExchange(&Fb2, F2); waiting(wait); InterlockedIncrement(&Fb2); InterlockedExchange((long*)&F1 , Fb1); InterlockedExchange((long*)&F2, Fb2); InterlockedExchange(&(p->F1), F1); InterlockedExchange(&(p->F2), F2); p->t2 = clock(); return 0; } void waiting(clock_t dt) { clock_t tn; tn = clock(); while (clock() - tn < dt) ; return; }