IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> interlocked-функции winapi, c++/mingw
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


Подруга попросила помочь с лабой. Суть такова :
при нажатии "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;
}


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 3)
сообщение
Сообщение #2


Гость






А теперь - поконкретнее: 1) чего надо добиться? 2) что вообще выводится на экран? Я в этой куче цифр чего-то полезное могу найти? 3) задание - сделать это именно через Interlocked? Или сделать вообще?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


1. Синхронизации.
2. номер операции. код нажатой клавищи. ID потока, время начала работы потока, время конца работы потока, переменная в мэйне1 и 2, и в потоках.
ПО коду можно посмотреть..лаба запутанная, да.
3. Да.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Я так и не понял, чего тебе надо добиться? Какой синхронизации? При чем здесь Interlocked? Ты что, хочешь "вывернуть наизнанку" смысл Interlocked... функций, и сделать всю потоковую функцию атомарной? Это реализуется не через Interlocked, у них другая задача... CriticalSection - возможно - то, что тебе нужно...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.04.2024 15:40
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name