Как стать автором
Обновить

«Детская» задачка для программистов

Время на прочтение2 мин
Количество просмотров3.6K
В процессе разработки наших программных продуктов перед нами часто встают задачи для решения которых требуются глубокие знания языка C++, принципов работы компиляторов и процессоров.

Нашей компании нужны программисты, которые умеют решать подобные задачи.

Например одна из таких задач: не компилируя этот код (очень важно решить ее в голове) скажите сработает ли когда-нибудь вывод «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: обвязочный код пропущен за несущественностью и конечно же, речь идет об многоядерных процессорах.
Теги:
Хабы:
Всего голосов 39: ↑25 и ↓14+11
Комментарии118

Публикации

Информация

Сайт
www.metaquotes.net
Дата регистрации
Дата основания
Численность
Неизвестно
Местоположение
Кипр

Истории