336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
최신 버전의 C++11 라이브러리에서는 운영체제의 함수를 사용하지 않고도 자체적으로 멀티스레드를 구현할 수 있습니다. std::thread 클래스가 바로 그 기능을 수행합니다. 함수를 서로 다른 스레드에서 실행시키는 방법은 다음과 같습니다.
1. 스레드 객체를 생성한다.
std::thread의 생성자는
매개변수가 없는 함수의 경우: thread(함수)
매개변수가 있는 함수의 경우: thread(함수, 매개변수 순서대로 나열...)
이렇게 스레드 객체를 생성하는 것만으로도 이미 함수가 실행됩니다. 별도의 start/stop 함수를 호출하지 않습니다. 왜인지는 모르겠으나 C#처럼 해당 스레드를 일시중지시켰다 재개하는 기능은 원래 없습니다. C++의 thread클래스는 해당 함수가 스스로 종료할 때 까지 스레드를 유지합니다.
2. thread::join()함수를 실행한다.
C#의 스레드 클래스는 Main 메서드가 종료되어도 thread객체는 함수가 종료될때까지 그대로 유지되는데, C++에서는 스레드가 다 종료될 때까지 main함수에게 대기하라고 지시해야 합니다. join함수가 그런 역할을 합니다.
thread 클래스는 다음과 같은 틀을 가집니다.
/* thread.cpp */ #include <iostream> #include <thread> void function1(); void function2(const char * str); void function3(const char * str, int count); int main(int argc, char * argv[]) { /* function1 함수를 별도의 스레드에서 실행 시작 */ std::thread thread1(function1); /* function2, 3 함수를 매개변수를 대입해 별도의 스레드에서 실행 시작 */ std::thread thread2(function2, "Hello, World!"); std::thread thread3(function3, "count 5000", 10); char _tmp = '\0'; std::cout << "main... start" << std::endl; std::cout << "main... end" << std::endl; /* 모든 스레드가 종료되기도 전에 main 함수가 종료되지 않도록 보류시킵니다. */ /* 이것을 넣기 않으면 Debug Assertion Error를 냅니다. */ thread1.join(); thread2.join(); thread3.join(); std::cout << "Press Enter to Exit..."; std::cin.ignore(); return 0; } void function1() { for (int i = 0; i < 50; i++) { std::cout << "function1 : " << i << std::endl; } } void function2(const char * str) { for (int i = 0; i < 50; i++) { std::cout << "function2 : " << str << " " << i << std::endl; } } void function3(const char * str, int count) { for (int i = 0; i < count; i++) { std::cout << "function2 : " << str << " " << i << std::endl; } }
위 코드를 실행하면 function1, function2, function3이 서로 다른 스레드에서 동시에 실행되어 출력 결과에 세 함수의 출력이 혼재되는 것을 확인할 수 있습니다.
'Programming Language > C&C++' 카테고리의 다른 글
소켓 통신 #2 - AF_INET 사용하기 (2) (0) | 2014.09.19 |
---|---|
소켓 통신 #2 - AF_INET 사용하기 (1) (0) | 2014.09.19 |
소켓 통신 #1 - 소켓 통신에 쓰이는 구조체 (2) | 2014.09.19 |
C언어 표준 문자열 관련 함수 – ANSI, Wide Char별 함수 이름 정리 (0) | 2011.02.14 |
코드 컨벤션 정리 – 낙타, 파스칼, 헝가리안 (0) | 2011.02.11 |