スレッドがキューに同時にアクセスしないように、キューの安全のためにクリティカル セクションが必要です。このコードは、クリティカル セクションに関連する行にコメントを付けても機能します。誰でも理由を説明できますか?
queue<int> que;
CRITICAL_SECTION csection;
int i=0;
DWORD WINAPI ProducerThread(void*)
{
while(1)
{
//if(TryEnterCriticalSection(&csection))
{
cout<<"Pushing value "<<i<<endl;
que.push(i++);
//LeaveCriticalSection(&csection);
}
}
}
//Consumer tHread that pops out the elements from front of queue
DWORD WINAPI ConsumerThread(void*)
{
while(1)
{
//if(TryEnterCriticalSection(&csection))
{
if(!que.empty())
{
cout<<"Value in queue is "<<que.front()<<endl;
que.pop();
}
else
Sleep(2000);
//LeaveCriticalSection(&csection);
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE handle[2];
//InitializeCriticalSection(&csection);
handle[0]=NULL;
handle[1]=NULL;
handle[0]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)ProducerThread,0,0,0);
if(handle[0]==NULL)
ExitProcess(1);
handle[1]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)ConsumerThread,0,0,0);
if(handle[1]==NULL)
ExitProcess(1);
WaitForMultipleObjects(2,handle,true,INFINITE);
return 0;
}