헛둘이 2022. 9. 20. 14:04
배운 이론을 실습하는 과정
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <Windows.h>
#include <process.h>
#include <tchar.h>
using namespace std;

HANDLE hSemaphore = INVALID_HANDLE_VALUE;

int totalCount = 0;

UINT threadProc(void* p)
{
    totalCount++;
    int count = totalCount;
    WaitForSingleObject(hSemaphore, INFINITE);
    printf("Start Routine %d!\n", count);

    Sleep(3000);

    printf("End Routine %d!\n", count);
    ReleaseSemaphore(hSemaphore, 1, NULL);
    return 0;
}


int main()
{
    hSemaphore = CreateSemaphoreEx(0, 3, 3, L"Sema1", 0, SEMAPHORE_ALL_ACCESS);
    vector<HANDLE> vH;

    for (int i = 0; i < 5; i++)
    {
        vH.push_back(
            (HANDLE)_beginthreadex(0, 0, threadProc, 0, 0, 0)
        );
    }


    WaitForMultipleObjects(5, vH.data(), TRUE, INFINITE);

    for (HANDLE h : vH)
        CloseHandle(h);

    CloseHandle(hSemaphore);

    return 0;
}

 

  • 실제로 여러 쓰레드로 동시에 작업했을 때, 생각한 대로 작동하는지 연습해보았다.
  • 세마포어를 만들고 카운트 3개, 리밋 3개를 걸어두었다.
  • 핸들을 동적 배열 vector에 담고 쓰레드를 5개를 만들어서 돌린다.
  • 생각대로라면 쓰레드 함수에선 3초동안 Sleep하므로 3개가 먼저 실행되고 3초 후 나머지 2개가 실행되어야 한다.

 

생각한대로 잘 작동한다