하하, 저도 멀티스레딩을 배울 때 이런 문제를 겪었는데, 출력 결과가 매번 달랐어요. 나중에 그 이유를 알게 되었는데, 그것은 모두 멀티코어 때문이었습니다.
컴퓨터도 멀티코어여야 할 것 같아요. 단일 코어 CPU는 다중 스레드를 처리할 때 한 번에 하나의 명령만 실행할 수 있습니다. 즉, 프로그램에 스레드 수에 관계없이 한 번에 하나의 스레드에 있는 코드만 실행되며 CPU는 이를 차지합니다. 각 스레드에 시간 조각을 할당하면 해당 스레드의 코드가 실행됩니다. 그러나 멀티코어 CPU는 동시에 여러 스레드에서 코드를 실행할 수 있습니다. 이것이 진정한 "멀티스레딩"입니다. 따라서 프로그램은 단일 코어 컴퓨터에서 실행되는 데 아무런 문제가 없어야 하지만 다중 코어 CPU가 있는 컴퓨터의 결과는 매우 무작위적입니다.
게시한 그림의 경우 왼쪽의 런타임이 이렇게 됩니다. 먼저, cpu1이 메인 스레드에서 코드를 실행하고 이를 터미널에 출력합니다. =, 그러나 여러 CPU가 동시에 실행되고 있고 이때 cpu2가 ThreadProc에서 코드를 실행하고 터미널에 문자를 출력하기 시작했기 때문에 현재로서는 CPU1의 타임 슬라이스가 하나만 있습니다. CPU2가 ThreadProc에서 코드를 실행하고 스레드 17이 인쇄될 때까지 화면에 출력합니다. 이때 CPU1은 dwThreadId의 값을 인쇄합니다. 그러면 다시 ThreadProc의 나머지 코드 실행을 완료하고 몇 줄을 더 입력하는 것은 CPU2입니다.
오른쪽 프로그램이 실행 중일 때, cpu1이 메인 스레드 코드를 실행하고 출력한 후, cpu2가 스레드 함수의 코드를 실행하는 일이 발생하는데, 이는 여러분의 기대와 일치합니다.
그러나 핵심 문제는 각 CPU의 타임 슬라이스 할당을 예측할 수 없다는 것입니다. 따라서 원하는 출력을 얻는 것은 무작위 이벤트입니다.
멀티 코어 CPU의 프로그램 동기화 문제의 경우 세마포어, 뮤텍스 및 이벤트 개체를 사용하지 않는 것이 가장 좋습니다. 모두 커널 개체에 속하고 하나의 CPU에 사용되기 때문입니다. 다른 CPU는 사용자가 설정한 이러한 사항을 단순히 무시합니다. 또한 WaitForSingleObject(hThread, INFINITE)도 스레드 함수가 CPU에서 반환되기를 기다리고 있으며 CPU2에는 영향을 미치지 않습니다.
다중 스레드 동기화를 달성하려면 임계 섹션을 사용하는 것이 좋습니다. 임계 섹션은 커널 개체가 아니며 CPU 수가 아무리 많아도 프로세스 메모리의 영역일 뿐입니다. , 스레드가 이 메모리 영역에 액세스할 때 임계 섹션에 인쇄한 부분만 넣으면 됩니다.
#include "stdafx.h"
#include
#include
네임스페이스 std 사용 ;
CRITICAL_SECTION g_cs;
DWORD WINAPI ThreadProc(
LPVOID lpParameter // 스레드 데이터
)
{
int i=0;
while (i<20)
{
EnterCriticalSection(&g_cs);
cout<<"나는 스레드에서 왔습니다."<<" "<
LeaveCriticalSection(&g_cs);
}
return 0;
}
int main(int argc, char* argv[])
{
HANDLE hThread; /p>
DWORD dwThreadId;
InitializeCriticalSection(&g_cs);
// 스레드 생성
hThread = ::CreateThread (
NULL, //기본 보안 속성
NULL, //기본 스택 크기
ThreadProc, //스레드 항목 주소(스레드를 실행하는 함수)
NULL, // 함수에 전달된 매개변수
0, // 즉시 실행할 스레드 지정
&dwThreadId) // 스레드의 ID 번호를 반환합니다.
EnterCriticalSection (&g_cs);
cout<<"이제 또 다른 스레드가 생성되었습니다. ID ="<< dwThreadId <<"\n"
LeaveCriticalSection(&g_cs );
//새 스레드가 완료될 때까지 기다립니다.
::WaitForSingleObject (hThread, INFINITE)
::CloseHandle (hThread); p>
return 0 ;
}
ps: Hou Jie가 번역한 "Win32 Multi-Threaded 프로그래밍"은 kdzhy2008에서 출판되었지만 정말 좋은 책입니다. 1997년, 오늘날에도 여전히 많은 것들이 관련되어 있습니다.
도움이 되셨으면 좋겠습니다 ㅎㅎ~~