작성
·
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님, 세마포어와 관련된 실험과 질문을 주셔서 감사합니다. 여러분이 세마포어를 잘 이해하려고 노력하는 모습이 아주 인상적이네요. 질문하신 내용은 세마포어의 특성과 운영체제의 스케줄러(스레드 관리 시스템)에 관련된 이야기입니다.
세마포어의 작동 원리:
스레드 선택 이유:
세마포어 개수 증가에 따른 영향:
관련하여 더 유용한 정보를 얻기 위해, 다른 질문도 참고하시면 좋겠습니다:
“세마포어 예제 소스 코드 문의”: 여기에서는 소스코드를 탐구하면서 발생하는 세마포어에 관한 다양한 문제를 다루고 있습니다.
“세마포어 예제에 대한 질문이 있습니다.”: 다양한 세마포어 API와 스레드 핸들 관리를 다루는 내용입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.