|
CriticalSection 이 Release 가 되지 않으면 당연히 EnterCriticalSection
함수에서 대기하게 되겠죠. 그말은 CriticalSection 으로 둘려쌓인 코드블럭
을 빠져나오지 못한 쓰레드가 있다면 다른 쓰레드 계속 블럭킹된 상태에 머물
러 있을 수 밖에 없을겁니다. 일단 udp 관련 코드가 의심스러우시면 항상 종료
되는 다른 코드를 넣으셔서 다시 한번 테스트를 해보세요. 현재 보여주신 코드
만으로는 이말밖에 해드릴것이 없네요.
쓰레드 프로그램에서는 "불확정성의 원리" 가 적용되어 거의 확실한 듯하지만
미리 인지하기 힘든 부분이 블랙홀이 있을 수 있으니 특히나 신경을 많이 쓰셔
서 디자인하셔야 됩니다.
그럼 "멋진 엔지니어의 꿈"을 이루시길 바랍니다.
공부중 님이 쓰신 글 :
: 멀티쓰레드를 생성(약 20개쯤)하여 UDP소켓을 이용하여
: 데이타를 전송하는 프로그램을 작성하였습니다.
: 쓰레드상에서 다음과 같이
:
: void __fastcall ThreadProc::Execute()
: {
: ..................
:
: // A1
: EnterCriticalSection(&CriticalSection);
: dxinfo[ChanNo].ip_receive = 0;
: Form1->udp2->RemoteHost = HostIP;
: Form1->udp2->SendBuffer(buff,31,30);
: LeaveCriticalSection(&CriticalSection);
:
: }
: 멀티쓰레드에서 데이타를 보내야 하니까 CriticalSection을 이용하여
: 쓰레드간에 동기화를 시키고 빌더에 있는 UDP 컴포넌트를 이용하여 다른
: PC에 데이타를 전송하는 프로그램입니다.
: 그런테 하루에 1번쯤 A1부분에서 멈춰져 있습니다.
: 전체 쓰레드가 멈춘것인지 1개 쓰레드만 멈춘것인지 모르겠지만
: 종료후 다시 실행하면 예전같이 다시 돌아가고 왜 가끔가다 1번씩
: 이상이 있는지 원인을 모르겠슴다.
: 어느 부분에서 논리적인 에러가 있나요.
:
: EnterCiriticalSection으로만 사용하면 멀티쓰레드에서 사용하는데
: 이상은 없는것이죠..
|