반응형

[C++11] std::thread 사용법 (함수, 클래스)

 

std::thread란 

클래스 스레드는 단일 실행 스레드를 나타냅니다. 스레드를 사용하면 여러 기능을 동시에 실행할 수 있습니다. 

std::thread는 C++11에서 표준으로 되었습니다. 

 

 

std::thread Header 파일

#include <thread>

 

 

thread 생성 방법

thread 생성은 보통 아래 방법이 있습니다. 

lambda를 이용한 방법도 있는데, 나중에 한번 알아보도록 하겠습니다. 

1. 함수를 이용한 생성 => std::thread 변수(함수명, 전달인자)

2. Class 멤버 함수를 이용한 생성 => std::thread  변수(class명::thread 수행할 함수, class 생성자, 전달 인자);

3. Class Static 함수를 이용한 생성 => std::thread  변수(class명::thread 수행할 함수, 전달 인자);

 

 

 

thread 생성 예제

thread가 작업 중인데, main 함수에서 return 0; 으로 종료하려고 할 때, 비정상적으로 종료될 수 있습니다.

이를 방지하고자, thread의 join 함수를 사용하여, main thread는 자식 thread의 작업을 기다리고, thread의 작업이 끝나면, main thread는 실행을 재개합니다. 

thread를 실행시킬 때, 함수의 전달인자를 넣을 수도 있고, 넣지 않아도 됩니다.

 

1. 함수를 이용한 생성

1부터 1000까지 더하는 작업을 하는 thread를 만들어 보겠습니다. 

#include <iostream>
#include <string>
#include <thread>


void sum_thread()
{
    int sum = 0;
    for (int i = 1; i <= 1000; i++)
        sum += i;
    std::cout << "sum_thread() : " << sum << std::endl;
}

int main()
{
    std::thread sum(sum_thread);

    std::cout << "main() : start" << std::endl;
    sum.join();
    std::cout << "main() : finish" << std::endl;
}

위 코드를 실행해보면 아래와 같이 출력합니다. 

thread의 작업이 끝날때까지 기다리기위해 join 함수를 사용하였습니다. 

join 함수가 끝나고 main thread에서 실행을 재개합니다.

 

2. Class 멤버 함수를 이용한 생성 & 3. Class Static 함수를 이용한 생성

 

#include <iostream>
#include <string>
#include <thread>


class SUM {
public :
    static void sum_static(int num) {
        int sum = 0;
        for (int i = num; i <= 100; i++)
            sum += i;
        std::cout << "sum_static() : " << sum << std::endl;
    }
    void sum_func(int num) {
        int sum = 0;
        for (int i = num; i <= 1000; i++)
            sum += i;
        std::cout << "sum_func() : " << sum << std::endl;
    }
};

int main()
{

    // 2. Class의 멤버 함수를 사용한 Thread 생성
    std::thread thread1(&SUM::sum_func, SUM(), 10);


    // 3. Class의 Static 함수를 사용한 Thread 생성
    std::thread thread2(SUM::sum_static, 10);




    std::cout << "main() : start" << std::endl;
    thread1.join();
    thread2.join();
    std::cout << "main() : finish" << std::endl;
}

thread가 병렬로 작업을 수행해서 출력이 섞여서 출력이 됩니다. 

나중에는 이러한 것들을 순차적으로 수행할 수 있도록 해보도록 하겠습니다.

반응형
반응형

 

[Boost] boost 설치 및 visual studio에 설정하여 hello world 출력 - 윈도우 용

 

 

Boost 라이브러리란

Boost는 C++ 프로그래밍 언어를 위한 선형대수, 의사 난수 발생, 멀티스레딩, 영상 처리, 정규 표현식, 그리고 유닛 테스트와 같은 작업들과 구조들을 지원하는 라이브러리들의 집합입니다. Boost 라이브러리는 무료이며, Smart Pointer , Regular Expression, Thread - Mutex 등등 직접적으로 구현하고 안정화 시키기에 오랜 시간을 필요로하는 것을 알고리즘으로 한데 묶어놓아 개발자들이 사용하기 편하도록 API를 제공해줍니다.

 

0. Visual Studio 다운로드

Visual Studio IDE는 아래 경로에서 다운로드할 수 있습니다.

 

https://visualstudio.microsoft.com/ko/free-developer-offers/

 

무료 개발자 소프트웨어 및 서비스 - Visual Studio

무료 제공: Visual Studio Community, Visual Studio Code, VSTS 및 Dev Essentials.

visualstudio.microsoft.com

 

1. Boost 라이브러리 다운로드

아래 링크에 들어가서 윈도우 용 설치파일을 다운로드합니다. 

2022년 3월 9일 기준으로 최신버전은 1.78.0 버전입니다. 

압축파일 용량은 183MB 정도입니다. 

 

https://www.boost.org/users/download/

 

Boost Downloads

Current Release Version 1.78.0 December 8th, 2021 03:45 GMT Updated Libraries: Asio, Assert, Atomic, Beast, Core, Describe, DLL, Filesystem, Geometry, JSON, Lambda2, Log, Math, MultiIndex, Multiprecision, PFR, Predef, Regex, System, Utility, Variant2. Down

www.boost.org

2. Boost 라이브러리 압축 풀기 및 bootstrap.bat 파일 실행(빌드)

압축을 풀면 아래와 같이 파일이 생성됩니다. 

그 중에 bootstrap.bat 파일을 실행시킵니다.

추가 정보를 눌러 실행합니다.

실행하면 visual studio 폴더를 찾고, 빌드가 시작됩니다. 

한 몇분 지나면 완료되고 cmd 창이 자동으로 종료됩니다.

아래와 같이 b2.exe 파일이 생성된 것을 확인할 수 있습니다.

3. b2.exe 파일 실행하기 (boost 라이브러리 빌드)

b2.exe 파일을 실행시키면 boost 라이브러리 빌드를 시작합니다. 

시간이 좀 오래 걸립니다. 

빌드가 완료되면 cmd 창이 자동으로 종료되고, 아래와 같이 폴더 2개가 생성됩니다.

이제 boost 라이브러리는 준비되었고, Visual Studio에서 Boost 라이브러리를 사용해보도록 하겠습니다.

 

4. Visual Studio에서 새로운 프로젝트 생성 및 boost 라이브러리 추가하기

콘솔 앱으로 프로젝트를 생성해서, 간단하게 boost 라이브러리를 불러왔을 때, 에러없이 빌드가 되는지 확인해보겠습니다.

 

프로젝트가 생성되었으면, 이제 boost 라이브러리를 가져오도록 하겠습니다. 

그럼 프로젝트 > 속성에 들어갑니다. 

속성 페이지에서 2가지를 추가해야 합니다. 

1) include 경로

2) lib 경로

 

 

 

1) include 경로 추가

속성 페이지 > C/C++ > 일반 > 추가 포함 디렉터리에서 boost 경로를 추가해줍니다.

 

2) lib 경로

속성 페이지 > 링커 > 일반 > 추가 라이브러리 디렉터리에서 boost 라이브러리의 경로를 추가해줍니다.

1), 2)를 추가하였으면 적용을 누르고 확인 버트을 누릅니다.

5. boost 라이브러리 추가하고 빌드하기

이제 boost 라이브러리를 사용할 수 있습니다. 

include로 boost/ 를 입력해보면 아래와 같이 사용할 수 있는 라이브러리 header 파일이 자동으로 출력됩니다.

아래와 같이 boost의 lambda api를 사용해보도록 하겠습니다.

아래와 같이 코드를 작성하고 컴파일하면 컴파일 성공된 것을 볼 수 있습니다.

#include <iostream>
#include <boost/lambda/lambda.hpp>
#include <iterator>
#include <algorithm>

int main()
{
    typedef std::istream_iterator<int> in;

    std::cout << "Hello Boost!" << std::endl;

    std::cout << "Type in any number: ";

    std::for_each(
        in(std::cin), in(), std::cout
        << (boost::lambda::_1 * 10)
        << "\nType in another number: ");
}

컴파일이 성공되고, boost의 lambda를 사용한 출력물을 확인할 수 있습니다.

반응형
반응형

네트워크관리사 1급 / TCP/IP - ICMP(Internet Control Message Protocol)

 

 

ICMP(Internet Control Message Protocol) 이란

 망 내 교환 장비들이 오류 상황에 대한 보고를 할 수 있게 하고, 예상하지 못한 상황이 발생한 경우 이를 알릴 수 있도록 지원하는 프로토콜입니다. ICMP는 TCP/IP에서 네트워크 계층에서 동작합니다. 또한 IP에서의 오류(Error) 제어를 위하여 사용되며, 두 호스트간의 연결의 신뢰성을 테스트하기 위한 반향과 회답 메시지를 지원합니다. ping은 ICMP를 사용합니다. 

 

ICMP(Internet Control Message Protocol) 메시지 유형

- Echo Reply / Echo Request : pring 메시지를 발생시킵니다.

- Destination Unreachable

- Source Quench : 송신측의 데이터의 전송 속도를 늦추라는 의미를 갖습니다. 

- Redirection Required : 경로 변경 설정을 요청합니다. 

- Time To Live Exceeded : IP 패킷이 네트워크상에서 생존할 수 있는 시간이 초과할 경우 또는 목적지 호스트가 사용되지 않을 경우 사용됩니다. 

- Timestamp Request/Reply

- Address Mask Request/Reply 

 

관련 문제

2021년 1회 망 내 교환 장비들이 오류 상황에 대한 보고를 할 수 있게 하고, 예상하지 못한 상황이 발생한 경우 이를 알릴 수 있도록 지원하는 프로토콜은?
① ARP ② RARP
❸ ICMP ④ RIP

2020년 2회 ( ) 안에 들어갈 프로토콜은?
인터넷에서 라우터가 에러를 리포트하고 예기치 않았던 상황에 대한 정보를 제공하도록 하기 위하여 TCP/IP 프로토콜에 특수 목적 메시지를 첨가하였는데 이러한 프로토콜을 (   )라고 한다.
① FTP ❷ ICMP
③ ARP ④ TCP

2020년 1회 ICMP의 메세지 유형으로 옳지 않은 것은?
① Destination Unreachable
② Time Exceeded
③ Echo Reply
❹ Echo Research

2019년 2회 ICMP에 대한 설명 중 올바른 것은?
❶ IP에서의 오류(Error) 제어를 위하여 사용되며, 시작지 호스트의 라우팅 실패를 보고한다.
② TCP/IP 프로토콜에서 데이터의 전송 서비스를 규정한다.
③ TCP/IP 프로토콜의 IP에서 접속없이 데이터의 전송을 수행하는 기능을 규정한다.
④ 네트워크의 구성원에 패킷을 보내기 위한 하드웨어 주소를 정한다.

2019년 1회 ICMP 프로토콜의 기능으로 옳지 않은 것은?
❶ 여러 목적지로 동시에 보내는 멀티캐스팅 기능이 있다.
② 두 호스트간의 연결의 신뢰성을 테스트하기 위한 반향과 회답 메시지를 지원한다.
③ ′ping′ 명령어는 ICMP를 사용한다.
④ 원래의 데이터그램이 TTL을 초과하여 버려지게 되면 시간 초과 에러 메시지를 보낸다.

 

반응형
반응형

네트워크관리사 1급 / TCP/IP - SSH(Secure Shell)

 

SSH(Secure SHell)이란

네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해 주는 응용 프로그램 또는 보안 프로토콜입니다.  Sniffing의 공격을 막기위해 개발되었습니다. 

또한 TCP 포트 22번을 사용합니다.

 

관련 문제

2021년 2회 SSH 프로토콜은 외부의 어떤 공격을 막기 위해 개발 되었는가?
❶ Sniffing
② DoS
③ Buffer Overflow
④ Trojan Horse

2021년 1회 SSH 프로토콜이 사용하는 포트 번호는?
❶ TCP 22번 ② TCP 23번
③ UDP 24번 ④ UDP 25번

2020년 2회 응용 계층 수준에서 보안기능을 제공하는 프로토콜은?
① CA ② TLS
③ IPSec ❹ SSH

 

반응형

+ Recent posts