プログラマー向けの「子供向け」タスク

ソフトウェア製品の開発プロセスでは、C ++言語、コンパイラおよびプロセッサの原則に関する深い知識を必要とするタスクに直面することがよくあります。

当社には、このような問題を解決できるプログラマーが必要です。

たとえば、このようなタスクの1つです。このコードをコンパイルせずに(頭の中で解決することは非常に重要です)、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結束コードは重要でないためスキップされます。もちろん、マルチコアプロセッサについて話します。

Source: https://habr.com/ru/post/J50417/


All Articles