Windows API를 사용하여 뮤텍스 잠금 방법으로 100 개의 스레드를 생성하면 예기치 않은 결과가 발생합니다. 어떻게 해결해야합니까?

알파 하리 우스

현재 각 스레드의 지정된 인덱스를 동기화 된 방식으로 인쇄하는 간단한 다중 스레드 프로그램을 사용하여 <windows.h> 에서 API를 테스트 하고 있으며 각 인쇄 작업 사이에 1 초의 지연이 있습니다.

이 프로그램은 C로 작성되었지만 C ++에서도 동일하다고 생각합니다.

그리고 이것은 코드입니다.

#include <stdio.h>
#include <stdlib.h>

#include <windows.h>

#define THREAD_LEN 100
HANDLE mutex_handle = NULL;
HANDLE thread_handle[THREAD_LEN];

DWORD WINAPI execute(LPVOID param) {
  int id = *(int *) param;
  if (WAIT_OBJECT_0 != WaitForSingleObject(mutex_handle, INFINITE)) {
    printf("ERROR_CODE: %d\n", GetLastError());
  }
  printf("[%d]\n", id);
  Sleep(1000);
  ReleaseMutex(mutex_handle);
  return 0;
}

int main(void) {
  mutex_handle = CreateMutex(NULL, FALSE, NULL);
  DWORD thread_id;
  for (int i = 0; i < THREAD_LEN; i++) {
    int *id = (int *) malloc(sizeof(int));
    *id = i;
    thread_handle[i] = CreateThread(NULL, 
                                    0, 
                                    (LPTHREAD_START_ROUTINE) execute, 
                                    id,
                                    0, 
                                    &thread_id);
    if (!thread_handle[i]) {
      return 1;
    }
  }
  WaitForMultipleObjects(THREAD_LEN, thread_handle, TRUE, INFINITE);
  for (int i = 0; i < THREAD_LEN; i++) {
    CloseHandle(thread_handle[i]);
  }
  CloseHandle(mutex_handle);
  return 0;
}

그러나 예상치 못한 동작을 보여줍니다 .cmd를 통해 실행하면 Sleep (1000) 메서드가 작동하지 않으며 (프로그램은 초당 하나의 ID를 인쇄하지 않지만 단일 버스트에서) 모든 스레드에 ID가 인쇄되지는 않습니다. .

[0]
ERROR_CODE: 6
ERROR_CODE: 6
[30]
ERROR_CODE: 6
[5]
[29]
ERROR_CODE: 6
[33]
ERROR_CODE: 6
[34]
ERROR_CODE: 6
[41]
ERROR_CODE: 6
[37]
ERROR_CODE: 6
ERROR_CODE: 6
[47]
ERROR_CODE: 6
ERROR_CODE: 6
[55]
ERROR_CODE: 6
[43]
ERROR_CODE: 6
[44]
ERROR_CODE: 6
[38]
ERROR_CODE: 6
ERROR_CODE: 6
[17]
ERROR_CODE: 6
[50]
ERROR_CODE: 6
[76]
ERROR_CODE: 6
[11]
[36]
ERROR_CODE: 6
[42]
ERROR_CODE: 6
[57]
ERROR_CODE: 6
[13]
ERROR_CODE: 6
[58]
ERROR_CODE: 6

그러나 스레드 수를 60으로 줄이면 프로그램이 예상대로 작동합니다.

[0]
[3]
[2]
[1]
[6]
[34]
[37]
[39]
[8]
[9]
[46]
[11]
[51]
[53]
[55]
[58]
[16]
[17]
[18]
[19]
[20]
[22]
[21]
[23]
[24]
[25]
[26]
[27]
[28]
[29]
[30]
[31]
[32]
[33]
[4]
[36]
[35]
[38]
[5]
[7]
[40]
[42]
[41]
[43]
[44]
[45]
[10]
[47]
[48]
[49]
[50]
[12]
[52]
[13]
[54]
[14]
[56]
[57]
[59]
[15]
Joshua

WaitForMultipleObjects로 64 개 이상의 개체를 기다릴 수 없습니다. 필요한 경우 한 번에 64 개를 기다릴 수 있도록 더 많은 스레드를 생성하여 대기를 청크하십시오.

이를 시도하면 WaitForMultipleObjects가 즉시 반환되므로 뮤텍스를 즉시 닫고 WaitForSingleObject는 이미 닫힌 뮤텍스에 대해 불평합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관