C++11 동시 다발 지침 std::thread 상세 설명

4626 단어 C++11std::thread
지난 블 로그《C++11 병발 지침 1(C++11 다 중 스 레 드 초기 분석)》에서 std:thread 의 기본 용법 만 언급 하고 가장 간단 한 예 를 제시 했다.본 고 는 std:thread 의 용법 을 약간 상세 하 게 소개 할 것 이다.
std::thread 는헤더 파일 에 설명 되 어 있 기 때문에 std::thread 를 사용 할 때헤더 파일 을 포함 해 야 합 니 다.
std::thread 구조
default (1)

thread() noexcept;
initialization (2)

template <class Fn, class... Args>
explicit thread (Fn&& fn, Args&&... args);
copy [deleted] (3)

thread (const thread&) = delete;
move (4)

thread (thread&& x) noexcept;
(1).기본 구조 함수 로 빈 thread 실행 대상 을 만 듭 니 다.
(2).구조 함 수 를 초기 화하 고 thread 대상 을 만 듭 니 다.이 thread 대상 은 joinable 에 의 해 생 성 될 수 있 습 니 다.새로 생 긴 스 레 드 는 fn 함 수 를 호출 합 니 다.이 함수 의 인 자 는 args 에 의 해 제 시 됩 니 다.
(3).복사 구조 함수(비활성화)는 thread 가 복사 되 어 서 는 안 된다 는 것 을 의미한다.
(4).move 구조 함수,move 구조 함수,호출 성공 후 x 는 어떠한 thread 실행 대상 도 대표 하지 않 습 니 다.
메모:joinable 의 thread 대상 은 삭제 되 기 전에 주 스 레 드 join 또는 detached 로 설정 해 야 합 니 다.
std::thread 각종 구조 함수 예 는 다음 과 같다(레 퍼 런 스).

#include <iostream>
#include <utility>
#include <thread>
#include <chrono>
#include <functional>
#include <atomic>
 
void f1(int n)
{
  for (int i = 0; i < 5; ++i) {
    std::cout << "Thread " << n << " executing
"; std::this_thread::sleep_for(std::chrono::milliseconds(10)); } } void f2(int& n) { for (int i = 0; i < 5; ++i) { std::cout << "Thread 2 executing
"; ++n; std::this_thread::sleep_for(std::chrono::milliseconds(10)); } } int main() { int n = 0; std::thread t1; // t1 is not a thread std::thread t2(f1, n + 1); // pass by value std::thread t3(f2, std::ref(n)); // pass by reference std::thread t4(std::move(t3)); // t4 is now running f2(). t3 is no longer a thread t2.join(); t4.join(); std::cout << "Final value of n is " << n << '
'; }
move 할당 작업
move (1)

thread& operator= (thread&& rhs) noexcept;
copy [deleted] (2)

thread& operator= (const thread&) = delete;
(1).move 할당 작업,현재 대상 이 joinable 이 불가능 하 다 면 오른쪽 값 참조(rhs)를 move 할당 작업 에 전달 해 야 합 니 다.현재 대상 이 joinable 에 의 해 가능 하 다 면 terminate()가 잘못 보고 합 니 다.
(2).복사 할당 작업 이 비활성화 되 어 thread 대상 은 복사 할 수 없습니다.
아래 의 예 를 보십시오.

#include <stdio.h>
#include <stdlib.h>

#include <chrono>  // std::chrono::seconds
#include <iostream> // std::cout
#include <thread>  // std::thread, std::this_thread::sleep_for

void thread_task(int n) {
  std::this_thread::sleep_for(std::chrono::seconds(n));
  std::cout << "hello thread "
    << std::this_thread::get_id()
    << " paused " << n << " seconds" << std::endl;
}

/*
 * === FUNCTION =========================================================
 *     Name: main
 * Description: program entry routine.
 * ========================================================================
 */
int main(int argc, const char *argv[])
{
  std::thread threads[5];
  std::cout << "Spawning 5 threads...
"; for (int i = 0; i < 5; i++) { threads[i] = std::thread(thread_task, i + 1); } std::cout << "Done spawning threads! Now wait for them to join
"; for (auto& t: threads) { t.join(); } std::cout << "All threads joined.
"; return EXIT_SUCCESS; } /* ---------- end of function main ---------- */
기타 멤버 함수
get_id
스 레 드 ID 가 져 오기.
joinable
스 레 드 가 join 될 수 있 는 지 확인 합 니 다.
join
Join 스 레 드.
detach
Detach 스 레 드
swap
Swap 스 레 드.
native_handle
native handle 로 돌아 갑 니 다.
hardware_concurrency [static]
하드웨어 병발 특성 을 검사 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기