C++11 동시 다발 지침 std::thread 상세 설명
4626 단어 C++11std::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]
하드웨어 병발 특성 을 검사 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
어디서나 먹을 수있는 C++ 소프트웨어 엔지니어가되기 위해아래의 책은 숙독하자. 테스트 리팩토링, 좋은 설계란 무엇인가를 배울 수 있습니다. 임베디드 분야의 예를 사용하고 있습니다만, 임베디드를 하지 않는 사람이라도 도움이 되는 내용입니다. C/C++ 언어의 어려운 점은 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.