본문 바로가기
운영체제/[ecourse] Windows Programming

6-2-1. Semaphore 실습

by 헛둘이 2022. 9. 20.
배운 이론을 실습하는 과정
#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개가 실행되어야 한다.

 

생각한대로 잘 작동한다

'운영체제 > [ecourse] Windows Programming' 카테고리의 다른 글

6-2-3. Critical Section 실습  (0) 2022.09.20
6-2-2. Event 실습  (0) 2022.09.20
6-2. 동기화 개념과 Critical Section  (1) 2022.09.20
6-1. Thread Basic  (0) 2022.09.20
5-4. Stack Memory  (0) 2022.09.19

댓글