티스토리 뷰

C,C++

C,C++ 쓰레드 예제

figS 2020. 9. 17. 15:25
반응형

쓰레드는 쉽게 생각해서 병렬 처리라고 보시면 됩니다.

 

예로 시간을 세는 방법은 여러가지가 있지만 이렇게 코딩했다고 생각해 봅시다.

#include <iostream>
#include <process.h>
#include <Windows.h>

int main()
{
	int waittingTime = 1;

	while (true)
	{
		printf("지난 시간 %d초\r\n", waittingTime++);
		Sleep(1000);
	}

	return 0;
}

 

원하는대로 출력이 되었습니다.

이 와중에 어떠한 일을 하고 싶다고 하면 어떻게 해야 할까요? 

 

#include <iostream>
#include <process.h>
#include <Windows.h>

void CountTime();

int main()
{
	char lineData[255] = { 0, };

	// 함수안에서 while문이 돌기 때문에 blocked 상태가 된다.
	CountTime();

	// 프로그램이 여기까지 도달하지 못한다.
	while (true)
	{
		scanf_s("%[^\n]", &lineData, 255);

		printf("입력한 데이터 : %s", lineData);
	}
	return 0;
}

void CountTime()
{
	int waittingTime = 1;

	while (true)
	{
		printf("지난 시간 %d초\r\n", waittingTime++);
		Sleep(1000);
	}

}

 

숫자를 세는 코드를 함수화 시키고 추가로 키보드로 데이터를 입력 받게 했습니다.

CountTime 함수에서 while문을 빠져나올 수 없기 때문에 main함수의 while문은 동작하지 않습니다.

 

이와같이 blocked이 되는 함수, TCP, UDP Block 모드, 또는 데이터 송.수신이 느린 Serial 통신일 경우에는 쓰레드를 사용해서 별도로 처리해 주어야 합니다.

 

이제 CountTime함수를 쓰레드에서 동작하도록 변경해 보겠습니다.

 

반응형

 

#include <iostream>
#include <process.h>
#include <Windows.h>

unsigned __stdcall CountTime(void* arg); // 쓰레드 형태의 함수

int main()
{
	char lineData[255] = { 0, };

	// CountTime 쓰레드를 실행한다.
	HANDLE hCountTime = (HANDLE)_beginthreadex(NULL, 0, CountTime, NULL, 0, NULL);

	while (true)
	{
		fseek(stdin, 0, SEEK_END);

		scanf_s("%[^\n]", &lineData, 255);

		printf("입력한 데이터 : %s\r\n", lineData);
	}

	CloseHandle(hCountTime);
	return 0;
}

unsigned __stdcall CountTime(void *arg)
{
	int waittingTime = 1;

	while (true)
	{
		printf("지난 시간 %d초\r\n", waittingTime++);
		Sleep(1000);
	}
	_endthreadex(0);
}

 

시간 정보가 계속 출력이 되어서 이쁘게 보이진 않지만 잽싸게 입력하면 위처럼 보입니다.

 

위와 같이 쓰레드를 사용하면 block 함수에서 마냥 기다리는 것이 아니라 

다른 동작을 동시에 진행 할 수 있습니다.

 

반응형

'C,C++' 카테고리의 다른 글

오버로딩, 오버라이딩  (0) 2020.09.22
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함