2015-01-12 3 views
0

나는 4 개 스레드를 만들었습니다,하지만 난이 프로그램을 실행하고 때 출력으로이 무엇입니까 : 왜 그것이 내가 단지 4 스레드를 생성 한마지막으로 생성 된 스레드 만 실행하는 멀티 스레딩 프로그램?

  1. :

    Thread #: 1 
    Thread #: 2 
    Thread #: 3 
    Thread #: 3 
    Thread #: 4 
    Thread #: 4 
    Thread #: 4 
    Thread #: 5 
    Thread #: 5 
    Thread #: 5 
    . 
    . 
    . 
    Thread #: 5 
    Thread #: 5 
    

    나는이 개 질문이 스레드 표시 # : 5

  2. 생성 된 4 개의 스레드는 모두 순차적으로 실행되어야하지만 마지막으로 생성 된 스레드 만 실행하는 이유는 무엇입니까?

소스 코드 :

#include<windows.h> 


HANDLE ThreadHandle[4]; 
DWORD dwThreadId[4]; 

DWORD WINAPI ThreadFunction(LPVOID param) 
{ 

    while (1) 
    { 

     printf("Thread #: %d\n", *((int*)param)); 
    } 

    Sleep(10); 

    return 0; 
} 

int main() 
{ 
    static int i = 0; 
    for (i = 1; i <= 4; i++) 
    { 
     ThreadHandle[i] = CreateThread(NULL, 0, ThreadFunction, (LPVOID)&i, 0, &dwThreadId[i]); 
     Sleep(10); 

    }  
    while (1) 
    { 
     Sleep(100); 
    } 
    return 0; 
} 
+2

배열은 C로 0 인덱스가 지정됩니다.'ThreadHandle [4]'에의 기입은 미정 도리의 동작입니다. – EOF

+0

그리고 코드는 현재 {} 사용법으로 컴파일되지 않을 것입니다. 동시 콘솔 출력은 ... – deviantfan

답변

7

i 정적 변수 - 하나의 인스턴스 만이있다. printf에 전화 할 때마다 주소를 쓰레드에 전달하고 역 참조 해제합니다. 따라서 주 스레드가 i 값을 변경하면 모든 작업 스레드는 즉시 새 값을 봅니다. 바로 그 이유 때문에 스레드 # 5를 볼 수 있습니다. for() 루프가 끝나면 그 값은 i입니다.

(LPVOID)&i 대신 (LPVOID)i을 전달하고 스레드 내부에는 *((int*)param) 대신 (int)param을 사용하십시오. C에서 int와 back에 대한 포인터를 캐스팅하는 것은 합법적입니다 (오용 된 경우에도 위험 하긴하지만).

관련 문제