при нажатии "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;
}