В процессе разработки наших программных продуктов перед нами часто встают задачи для решения которых требуются глубокие знания языка C++, принципов работы компиляторов и процессоров.
Нашей компании нужны программисты, которые умеют решать подобные задачи.
Например одна из таких задач: не компилируя этот код (очень важно решить ее в голове) скажите сработает ли когда-нибудь вывод «BINGO»?
Объясните причину такого поведения?
Upd: обвязочный код пропущен за несущественностью и конечно же, речь идет об многоядерных процессорах.
Нашей компании нужны программисты, которые умеют решать подобные задачи.
Например одна из таких задач: не компилируя этот код (очень важно решить ее в голове) скажите сработает ли когда-нибудь вывод «BINGO»?
enum { INTERATIONS=100 };
LONG volatile sync1=0;
LONG volatile sync2=0;
int volatile aa[INTERATIONS]={0};
int volatile bb[INTERATIONS]={0};
int volatile test_aa[INTERATIONS]={0};
int volatile test_bb[INTERATIONS]={0};
DWORD WINAPI Thread1(void *arg)
{
while(1)
{
//--- synchronization
int sync=++sync1;
while(sync2<sync);
//---
for(int tt=0; tt<INTERATIONS; tt++)
{
bb[tt]=1;
test_aa[tt]=aa[tt];
}
//--- synchronization
sync=++sync1;
while(sync2<sync);
//--- testing
for(int tt=0; tt<INTERATIONS; tt++)
{
aa[tt]=bb[tt]=0;
if(test_aa[tt]==0 && test_bb[tt]==0) cout << "BINGO" << endl;
}
//---
}
//---
return(0);
}
DWORD WINAPI Thread2(void *arg)
{
while(1)
{
int sync=++sync2;
while(sync1<sync);
//---
for(int tt=INTERATIONS-1; tt>=0; tt--)
{
aa[tt]=1;
test_bb[tt]=bb[tt];
}
//--- synchronization
sync=++sync2;
while(sync1<sync);
}
//---
return(0);
}
Объясните причину такого поведения?
Upd: обвязочный код пропущен за несущественностью и конечно же, речь идет об многоядерных процессорах.