2013-05-02 3 views
0

CreateThread()를 사용할 때 두 스레드가 스레드 프로 시저로 "ThreadProc"라는 단일 함수를 사용할 수 있습니까?두 스레드가 동일한 스레드 프로 시저를 사용할 수 있습니까?

HANDLE thread1= CreateThread(NULL, //Choose default security 
           0, //Default stack size 
           (LPTHREAD_START_ROUTINE)&ThreadProc, 
           //Routine to execute. I want this routine to be different each time as I want each thread to perform a different functionality. 
           (LPVOID) &i, //Thread parameter 
           0, //Immediately run the thread 
           &dwThreadId //Thread Id 
          ) 
HANDLE thread2= CreateThread(NULL, //Choose default security 
           0, //Default stack size 
           (LPTHREAD_START_ROUTINE)&ThreadProc, 
           //Routine to execute. I want this routine to be different each time as I want each thread to perform a different functionality. 
           (LPVOID) &i, //Thread parameter 
           0, //Immediately run the thread 
           &dwThreadId //Thread Id 
          ) 

위의 코드는 동일한 기능을 가진 두 개의 스레드를 만듭니다 (두 스레드의 스레드 프로 시저가 같기 때문에). 올바르게 수행하고 있습니까?

두 스레드가 동일한 스레드 프로 시저를 사용하고 있으므로 동기화 문제가 발생할 수 있습니다.

도와주세요. 나는 정말로 혼란스럽고 인터넷을 통해 아무것도 찾을 수 없었다.

+0

여기에서 시작하십시오 : http://en.wikipedia.org/wiki/Thread_(computing) –

+1

두 번째 스레드 ID가 첫 번째 스레드 ID를 덮어 씁니다. 쓰레드 ID를 신경 쓰지 않는다면, 그냥'NULL'을 전달하십시오. 만약 당신이 신경 쓰면'dwThreadId1'과'dwThreadId2' (또는 배열)를 사용하십시오. – MSalters

+0

+1, 고맙습니다. – Ayse

답변

6

다중 스레드의 스레드 진입 점과 동일한 기능을 사용하는 것이 좋습니다.

그러나 게시 된 코드에서 i의 주소가 두 스레드로 전달됩니다. 두 스레드가이 메모리를 수정하고 다른 스레드가 읽는 경우 i에 경쟁 조건이 있습니다. i 선언을 보지 않고는 아마도 로컬 변수 일 것입니다. 스레드가 i이 수명 동안 존재해야하므로 위험합니다. i이 아닌 경우 스레드에 매달린 포인터가 있습니다. 스레드 인수를 동적으로 할당하고 각 스레드가 해당 인수를 사용 가능하게하는 것이 일반적입니다.

+0

내 코드를 수정했습니다.지금보십시오. ( – Ayse

+0

@AyeshaHassan, 대답에 대한 응답으로 질문을 편집하지 마십시오. 나중에 질문에 와서 게시 된 답변이 잘못되거나 도움이되지 않는 것처럼 보이기 때문에 혼란스러워 할 수 있습니다. "스레드 인수를 전달"또는 새로운 질문을 게시하십시오. – hmjd

+0

나는 그것을 얻었다. 설명을 위해 많이 고마워. – Ayse

4

스레드가 동일한 코드를 사용하는지 여부는 관련이 없습니다. 동기화시 아무런 효과가 없습니다. 서로 다른 기능을하는 것처럼 정확하게 작동합니다. 잠재적 인종 문제는 동일합니다.

아마 두 포인터에 동일한 포인터를 전달하고 싶지는 않을 것입니다. 그러면 데이터 경쟁으로 이어질 것입니다. (우리는 코드를 확실히 알고 있어야합니다.)

2

코드가 맞습니다. 두 스레드간에 동기화 문제가 없습니다. 동기화가 필요한 경우 동일한 전역 변수를 변경하기 때문에 동일한 스레드 프로 시저를 사용하지 않기 때문일 수 있습니다.

+0

정말 고마워요 :) – Ayse

5

예, 동일한 엔트리 포인트로 시작하는 여러 (동시) 스레드를 가질 수 있습니다. OS/스레딩 라이브러리가 서명을 지정하고 호출한다는 사실 외에도 스레드 진입 점 기능에 특별한 것은 없습니다. 이 함수는 여러 스레드에서 다른 함수를 호출 할 때와 동일한주의 사항으로 여러 스레드를 시작할 때 사용할 수 있습니다. 비공유 공유 변수에 액세스하려면 동기화가 필요합니다.

각 스레드는 고유 한 스택 영역을 사용하지만 스레드 프로 시저가 호출되기 전에 OS에 의해 할당되므로 스레드 프로 시저가 호출 될 때까지 새 스레드를 만들고 시작하는 데 필요한 모든 특수 작업을 수행 할 수 있습니다. 이미 일어났다.