강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

wjdwlgns8096님의 프로필 이미지
wjdwlgns8096

작성한 질문수

Windows 시스템 프로그래밍 - 기본

세마포어

세마포어 개수에 따른 스레드 점유상태

작성

·

1

0

//#include "pch.h"
//#include "Logger/Console/Console.h"
#include <string>
#include <cstdlib>
#include <iostream>
#include <Windows.h>
HANDLE Semaphore;
std::string Strings[10];

void SetString(LPVOID InParam)
{
	int Index = *(int*)InParam;
	delete InParam;
	while (true)
	{
		Strings[Index] = "Thread" + std::to_string(Index) + ": Is Waiting";
		::WaitForSingleObject(Semaphore, INFINITE);
		Strings[Index] = "##Thread" + std::to_string(Index) + ": Is Selected##";

		::Sleep(500);
		::ReleaseSemaphore(Semaphore, 1, nullptr);
	}
}
int main()
{
	Semaphore = ::CreateSemaphore(nullptr, 3, 3, nullptr);
	for (int i = 0; i < 10; ++i)
		::CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)SetString, (LPVOID)new int(i), 0, nullptr);

	while (true)
	{
		system("cls");
		for (const std::string& String : Strings)
			std::cout << String << std::endl;
		::Sleep(1000);
	}
}

안녕하세요 세마포어 강의를 수강하다가 직접 실험하고 있었는데 세마포어 개수가 4개 이하일 때는 스레드 점유상태가 계속 달라지는걸 확인했는데 5개 이상으로 세마포어 개수를 늘리니 이미 점유된 스레드만 계속 점유가 되는 상황이 발생한걸 확인하였습니다. 혹시 이유가 점유가 해제되어 바로 대기상태에 들어갔는데 그 스레드를 바로 os가 또 채택하기 때문일까요?

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

wjdwlgns8096님, 세마포어와 관련된 실험과 질문을 주셔서 감사합니다. 여러분이 세마포어를 잘 이해하려고 노력하는 모습이 아주 인상적이네요. 질문하신 내용은 세마포어의 특성과 운영체제의 스케줄러(스레드 관리 시스템)에 관련된 이야기입니다.

  1. 세마포어의 작동 원리:

    • 세마포어는 일정 수의 스레드만이 동시에 접근할 수 있도록 하는 동기화 도구입니다. 예를 들어, 세마포어가 3이라면 최대 3개의 스레드가 동시에 자원을 사용할 수 있습니다. 그 이상 스레드가 자원을 사용하려고 할 경우에는 대기해야 합니다.
  2. 스레드 선택 이유:

    • 일반적으로 운영체제의 스케줄러는 스레드의 선택 및 실행순서를 결정합니다. 세마포어의 사용에서 해제된 스레드가 바로 다시 점유하는 경우는, 방금 실행을 마친 스레드가 바로 이어서 실행되기 때문에 발생할 수 있습니다. 이는 시간, 자원의 효율적인 사용 또는 우선순위에 의해 결정됩니다. 자원을 일단 해제한 직후 다시 요청하는 스레드가 대기열에서 우선적으로 선택될 수 있습니다.
  3. 세마포어 개수 증가에 따른 영향:

    • 세마포어의 개수가 더 많아지면, 특정 스레드가 상대적으로 더 많은 기회를 얻어 점유 상태를 유지하는 일이 발생할 수 있습니다. 이는 운영체제 스케줄러의 알고리즘에 따라 달라질 수 있습니다. 다시 말해, 세마포어의 크기를 늘림으로써 특정 스레드가 더 잦은 기회를 얻고 그로 인해 탐색이 더 자주 발생하게 되는 것입니다.

관련하여 더 유용한 정보를 얻기 위해, 다른 질문도 참고하시면 좋겠습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

wjdwlgns8096님의 프로필 이미지
wjdwlgns8096

작성한 질문수

질문하기