C++thread 용법 요약

5640 단어 C++thread
1,소개
C++11 에헤더 파일 이 추가 되 었 습 니 다.이 헤더 파일 은 주로 std::thread 스 레 드 류 를 설명 합 니 다.C++11 의 표준 클래스 std::thread 는 스 레 드 를 패키지 하고 C++11 표준 중의 스 레 드 를 나타 내 는 클래스,상호 배척 방문 에 사용 되 는 클래스 와 방법 등 을 정의 합 니 다.C++11 의 std::thread 를 사용 하면 다 중 스 레 드 프로그램의 이동 값 에 편리 합 니 다.
std::thread 클래스 구성원 함수:
(1)、get_id:스 레 드 ID 를 가 져 오고 std:thread::id 의 대상 을 되 돌려 줍 니 다.
(2),joinable:스 레 드 가 join 될 수 있 는 지 확인 합 니 다.thread 대상 이 이벤트(active)의 타당 성 스 레 드 를 표시 하 는 지 확인 합 니 다.구조 가 부족 한 thread 대상,join 이 완 료 된 thread 대상,detach 가 완 료 된 thread 대상 은 joinable 이 아 닙 니 다.
(3),join:이 함 수 를 호출 하면 현재 스 레 드 를 막 을 수 있 습 니 다.join 의 std::thread 대상 표지 의 스 레 드 가 끝 날 때 까지 호출 자(caller)가 있 는 스 레 드 를 막 습 니 다.
(4),detach:현재 스 레 드 대상 이 대표 하 는 실행 인 스 턴 스 를 이 스 레 드 대상 과 분리 하여 스 레 드 의 실행 을 단독으로 진행 할 수 있 도록 합 니 다.스 레 드 가 실행 되면 분 배 된 자원 이 방출 됩 니 다.
(5)、native_handle:이 함 수 는 std:thread 와 관련 된 스 레 드 핸들 을 되 돌려 줍 니 다.native_handle_type 은 thread 클래스 와 운영 체제 SDK API 를 연결 하 는 다리 입 니 다.예 를 들 어 Linux g+(libstdc+)에서 nativehandle_type 사실은 pthread 에 있 는 pthreadt 유형,thread 류 의 기능 이 우리 의 요 구 를 만족 시 키 지 못 할 때(예 를 들 어 특정한 스 레 드 의 우선 순 위 를 바 꾸 는 것)thread 류 인 스 턴 스 를 통 해 nativehandle()반환 값 은 매개 변수 로 관련 pthread 함 수 를 디 렉 터 리 에 호출 합 니 다.This member function is only present in class thread if the library implementation supports it. If present, it returns a value used to access implementation-specific information associated to the thread.
(6),swap:두 스 레 드 대상 이 대표 하 는 바 텀 핸들 을 교환 합 니 다.
(7)、operator=:moves the thread object
(8)、hardware_concurrency:정적 구성원 함수,현재 컴퓨터 의 가장 큰 하드웨어 병렬 스 레 드 수 를 되 돌려 줍 니 다.기본적으로 프로세서 의 핵심 숫자 로 볼 수 있다.
또한 std::thread:id 는 라인 ID 를 표시 하고 실행 할 때 운영 체제 에서 유일 하 게 이 라인 을 표시 할 수 있 는 식별 자 를 정의 하 며 그 값 은 표 시 된 라인 의 상 태 를 표시 할 수 있다.Values of this type are returned by thread::get_id and this_thread::get_id to identify threads.
때때로 우 리 는 스 레 드 실행 코드 에서 현재 호출 자 스 레 드 를 조작 해 야 합 니 다.이러한 상황 에 대해 C++11 에서 네 임 스페이스 this 를 전문 적 으로 정의 합 니 다.thread,이 네 임 스페이스 도헤더 파일 에 있 습 니 다.get 을 포함 합 니 다.id()함 수 는 현재 호출 자의 스 레 드 ID 를 가 져 오 는 데 사 용 됩 니 다.yield()함 수 는 호출 자 스 레 드 를 실행 상태 에서 벗 어 나 운영 체제 에 다시 맡 길 수 있 습 니 다.즉,현재 스 레 드 가 실행 을 포기 하고 운영 체제 가 다른 스 레 드 를 계속 실행 하도록 예약 할 수 있 습 니 다.sleep_until()함 수 는 특정한 시간(time point)까지 스 레 드 를 휴면 시 켜 야 이 스 레 드 가 다시 깨 어 납 니 다.sleep_for()함 수 는 스 레 드 를 특정한 시간 편(time span)에 휴면 시 키 는 것 입 니 다.이 스 레 드 는 다시 깨 어 납 니 다.그러나 스 레 드 스케줄 등 으로 인해 실제 휴면 은 sleep 보다 가능 합 니 다.duration 이 표시 하 는 시간 이 더 깁 니 다.
1.스 레 드 만 들 기
스 레 드 를 만 드 는 것 이 비교적 간단 합 니 다.std 의 thread 를 사용 하여 스 레 드 대상 을 예화 하면 만 들 수 있 습 니 다.예제:

#include <iostream>
#include <thread>
#include <stdlib.h> //sleep
 
using namespace std;
 
void t1() //     ,      
{
  for (int i = 0; i < 10; ++i)
  {
    cout << "t1111
"; sleep(1); } } void t2() { for (int i = 0; i < 20; ++i) { cout << "t22222
"; sleep(1); } } int main() { thread th1(t1); // th1, t1 , (t1()) thread th2(t2); th1.join(); // join detach th2.join(); //or use detach //th1.detach(); //th2.detach(); cout << "here is main

"; return 0; }
상기 에서 언급 한 문 제 는 detach 를 사용 하여 해결 할 수 있 습 니 다.detach 는 스 레 드 대상 과 분리 하 는 데 사 용 됩 니 다.이러한 스 레 드 는 독립 적 으로 실 행 될 수 있 습 니 다.그러나 thread 대상 이 이 스 레 드 를 가리 키 지 않 아 통 제 력 을 잃 었 습 니 다.대상 이 구 조 를 분석 할 때 스 레 드 는 백 스테이지 에서 계속 실 행 됩 니 다.그러나 메 인 프로그램 이 종료 할 때 스 레 드 가 실 행 될 수 있 음 을 보장 할 수 없습니다.좋 은 제어 체제 나 이런 백 스테이지 스 레 드 가 없 으 면 detach 대신 join 을 사용 하 는 것 이 좋 습 니 다.
2,mutex 와 std::lockguard 사용
헤더 파일 은\#include입 니 다.mutex 는 스 레 드 동기 화 를 확보 하고 서로 다른 스 레 드 가 같은 공유 데 이 터 를 동시에 조작 하 는 것 을 방지 합 니 다.
하지만 lock 사용guard 는 상대 적 으로 안전 합 니 다.역할 도 메 인 을 기반 으로 자동 으로 잠 금 을 풀 수 있 습 니 다.이 대상 이 생 성 될 때 m.lock()처럼 상호 배척 자 물 쇠 를 얻 을 수 있 습 니 다.수명 주기 가 끝 날 때 자동 으로 구조 분석(unlock)을 할 수 있 습 니 다.특정한 스 레 드 가 이상 하 게 종료 되 어 다른 스 레 드 에 영향 을 주지 않 습 니 다.예시:

#include <iostream>
#include <thread>
#include <mutex>
#include <stdlib.h>
 
int cnt = 20;
std::mutex m;
void t1()
{
  while (cnt > 0)
  {  
    std::lock_guard<std::mutex> lockGuard(m);
    // std::m.lock();
    if (cnt > 0)
    {
      //sleep(1);
      --cnt;
      std::cout << cnt << std::endl;
    }
    // std::m.unlock();
    
  }
}
void t2()
{
  while (cnt > 0)
  {
    std::lock_guard<std::mutex> lockGuard(m);
    // std::m.lock();
    if (cnt > 0)
    {
      --cnt;
      std::cout << cnt << std::endl;
    }
    // std::m.unlock();
  }
}
 
int main(void)
{
 std::thread th1(t1);
 std::thread th2(t2);
 
 th1.join();  //  t1  
 th2.join();  //  t2  
 
 std::cout << "here is the main()" << std::endl;
 
 return 0;
}
출력 결과,cnct 는 순서대로 줄 어 들 었 습 니 다.다 중 스 레 드 로 인해 순 서 를 흐 트 러 뜨리 지 않 았 습 니 다:
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
here is the main()
여기 서 C+thread 용법 에 대한 상세 한 정 리 를 위 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C+thread 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기