API 쓰레드부분 질문입니다.
연체리
#include iostream.h
#include windows.h
void Producer(void* arg)
{
int i;
for(i=10; i20; i++)
cout Producer i endl;
}
void Consumer(void* arg)
{
int i;
for(i=20; i30; i++)
cout Consumer i endl;
}
void main()
{
HANDLE hThreadVector[2];
DWORD ThreadID;
hThreadVector[0] = CreateThread (NULL, (unsigned)0,
(LPTHREAD_START_ROUTINE) Producer,
NULL, 0, (LPDWORD)&ThreadID);
hThreadVector[1] = CreateThread (NULL, 0,
(LPTHREAD_START_ROUTINE) Consumer,
NULL, 0, (LPDWORD)&ThreadID);
int i;
for(i=0; i10; i++)
cout Main i endl;
WaitForMultipleObjects(2,hThreadVector,TRUE,INFINITE);
}
다음과 같은 소스가 있습니다. 물론 컴파일도되고 실행도 됩니다.
하지만 몇번 실행하다보면(3번이상연속으로 계속실행)최초 출력되는 main이 9까지 찍힌후 Producer를 찍어줘야하는데
main 은 8을 두번찍고 Producer과 Consumer를 찍어주고 난후에 main = 9가 맨나중에 찍힙니다.
과제이긴 한데 문제점을 모르니 아예 갈피를 못잡겠네요 쓰레드 부분에서 오는 문제점인거같은데
왜그런건가요 도와주세요
-
한가람
아~~ 설명 지댑니다~ 이해가쏙되네요 ㄳㄳ
제가 이거들고 교수님께 갔는데 넘 귀찮은 듯이 설명한거와는 다르게 ㅠㅠ 감사합니다.
나머지 부분은 제가 해볼께요 ㅋㅋㅋ -
키클
이벤트쪽은 msdn에서 CreateEvent나 네이버에서 검색해보면 자료가 많이 있으니 찾아서 확인해보세요.
도움이 되시길해서 그냥 적어봅니다 -
올해1살
정답은 아니구요. 쓰레드까리 연동해서 동기화를 맞추려면, 동기화 처리가 필요해요. 일반적으로, 이벤트를 많이 쓰거든요. CreateEvent, WaitForSingleObject 등을 이용해서, 서로 동기화를 맞추죠.
님께서 올린소스를 제가 실행해본건 아니라서 모르겠지만, 쓰레드를 2개 생성한후, WaitForMultipleObjects 함수를 호출하셨는데, 쓰레드가 실행된후, 그러니까, 쓰레드 실행시 호출되는 함수, Producer, Consumer