상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
수정하기 - C++에서 std::thread의 기본 사용법은?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
C++에서 `std::thread`는 C++11부터 도입된 <a href='https://sangseek.com/sangseeks/멀티스레딩/ko'>멀티스레딩</a>을 위한 클래스입니다. 이를 통해 여러 스레드를 생성하고 관리할 수 있으며, 병렬 처리를 통해 프로그램의 성능을 향상시킬 수 있습니다. `std::thread`의 기본 사용법에 대해 자세히 알아보겠습니다. 1. 기본 개념 `std::thread`는 C++ 표준 라이브러리의 `<thread>` 헤더에 정의되어 있습니다. 스레드는 독립적으로 실행되는 코드의 흐름을 의미하며, 여러 스레드를 사용하면 CPU의 여러 코어를 활용하여 작업을 병렬로 수행할 수 있습니다. 2. 스레드 생성 스레드를 생성하려면 `std::thread` 객체를 생성할 때 실행할 함수나 함수 객체를 인자로 전달합니다. 다음은 기본적인 스레드 생성 예제입니다. ```cpp include <iostream> include <thread> void hello() { std::cout << "Hello from thread!" << std::endl; } int main() { std::thread t(hello); // hello 함수를 실행하는 스레드 생성 t.join(); // 메인 스레드가 t 스레드가 종료될 때까지 대기 return 0; } ``` 위의 코드에서 `hello` 함수는 새로운 스레드에서 실행됩니다. `t.join()`은 메인 스레드가 `t` 스레드가 종료될 때까지 기다리도록 합니다. 만약 `join()`을 호출하지 않으면 프로그램이 종료될 때 `t` 스레드가 아직 실행 중일 수 있으며, 이는 정의되지 않은 동작을 초래할 수 있습니다. 3. 스레드에 인자 전달 스레드에 인자를 전달하려면, `std::thread` 생성자에 인자를 추가로 전달하면 됩니다. 예를 들어: ```cpp include <iostream> include <thread> void printNumbers(int n) { for (int i = 0; i < n; ++i) { std::cout << i << " "; } std::cout << std::endl; } int main() { std::thread t(printNumbers, 10); // printNumbers 함수에 10을 인자로 전달 t.join(); return 0; } ``` 위의 예제에서 `printNumbers` 함수는 0부터 n-1까지의 숫자를 출력합니다. `std::thread` 생성자에 `printNumbers`와 함께 인자 `10`을 전달하여 스레드를 생성합니다. 4. 스레드의 복사 및 이동 `std::thread` 객체는 복사할 수 없지만 이동할 수 있습니다. 스레드를 다른 스레드로 이동하려면 `std::move`를 사용합니다. ```cpp include <iostream> include <thread> include <utility> void task() { std::cout << "Task is running!" << std::endl; } int main() { std::thread t1(task); std::thread t2 = std::move(t1); // t1을 t2로 이동 if (t1.joinable()) { std::cout << "t1 is joinable" << std::endl; // t1은 더 이상 joinable하지 않음 } t2.join(); // t2 스레드가 종료될 때까지 대기 return 0; } ``` 5. 스레드의 종료 스레드는 `join()` 또는 `detach()`를 호출하여 종료할 수 있습니다. `join()`은 스레드가 종료될 때까지 기다리지만, `detach()`는 스레드를 분리하여 독립적으로 실행되도록 합니다. 분리된 스레드는 더 이상 메인 스레드와 연결되지 않으며, 메인 스레드가 종료되더라도 계속 실행됩니다. ```cpp include <iostream> include <thread> include <chrono> void detachedTask() { std::this_thread::sleep_for(<a href='https://sangseek.com/sangseeks/std::chrono/ko'>std::chrono</a>::seconds(1)); std::cout << "Detached task finished!" << std::endl; } int main() { std::thread t(detachedTask); t.detach(); // 스레드를 분리 std::cout << "Main thread is doing something else..." << std::endl; std::this_thread::sleep_for(std::chrono::seconds(2)); // 메인 스레드가 잠시 대기 return 0; // 메인 스레드가 종료되더라도 detachedTask는 계속 실행됨 } ``` 6. 스레드 안전성 스레드를 사용할 때는 데이터 경쟁(data race)과 같은 문제를 피하기 위해 스레드 안전성을 고려해야 합니다. 이를 위해 `std::mutex`, `std::<a href='https://sangseek.com/sangseeks/lock_guard/ko'>lock_guard</a>`, `std::<a href='https://sangseek.com/sangseeks/unique_lock/ko'>unique_lock</a>` 등을 사용하여 <a href='https://sangseek.com/sangseeks/공유 자원/ko'>공유 자원</a>에 대한 접근을 제어할 수 있습니다. ```cpp include <iostream> include <thread> include <mutex> std::mutex mtx; // 뮤텍스 객체 int sharedCounter = 0; void increment() { for (int i = 0; i < 1000; ++i) { std::lock_guard<std::mutex> lock(mtx); // 뮤텍스 잠금 ++sharedCounter; } } int main() { std::thread t1(increment); std::thread t2(increment); t1.join(); t2.join(); std::cout << "Final counter value: " << sharedCounter << std::endl; return 0; } ``` 위의 예제에서 `std::lock_guard`를 사용하여 `sharedCounter`에 대한 접근을 안전하게 보호합니다. 두 개의 스레드가 동시에 `increment` 함수를 호출하더라도 데이터 경쟁이 발생하지 않습니다. 결론 `std::thread`는 C++에서 멀티스레딩을 구현하는 강력한 도구입니다. 스레드를 생성하고 관리하는 기본적인 방법을 이해하고, 스레드 안전성을 확보하기 위해 적절한 동기화 기법을 사용하는 것이 중요합니다. 이를 통해 C++ 프로그램의 성능을 향상시키고, 복잡한 작업을 효율적으로 처리할 수 있습니다.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기