무엇을 하는 C++에서 20?

무엇을 하에서[태그:C++20]?

어떤 면에서 그것은 다른"Parallelism2"및/또는"Concurrency2"(모습으로 아래에 이미지)?

아래 이미지에서 ISOCPP.

https://isocpp.org/files/img/wg21-timeline-2017-03.png

질문에 대한 의견 (4)
해결책

추상적인 수준은,하로 분할의 아이디어를 실행 상태의 아이디어의 스레드를 실행합니다.

SIMD(single instruction multiple data)는 여러"실행 스레드"하지만 하나는 실행 상태(그냥 작품에 여러 데이터). 틀림없이 병렬 알고리즘은 다음과 같이 비트에 있는 한"프로그램"에서 실행되는 다른 데이터입니다.

실을 꿰는 여러"실행 스레드"그리고 여러 실행 states. 당신이 하나 이상의 프로그램,그리고 더 이상 하나의 스레드를 실행합니다.

하이 여러 개국 실행하지 않지만,자신의 스레드로 실행합니다. 프로그램이 있고,프로그램 상태를 가지고 있지만,그것은 스레드 실행이 있습니다.


가장 쉬운 예제의 하는 발전기 또는 enumerables 에서 다른 언어가 있습니다.

에서 의사 코드:

function Generator() {
  for (i = 0 to 100)
    produce i
}

발전이라고 처음 호출이 반환0. 그것의 상태는 기억(어떻게 많은 상태에 따라 다릅의 구현을 하고),다음 시간 당신은 그것을 계속합니다. 그래서 그는 1 을 반환합니다. 한 다음 2.

마지막으로의 끝에 도달 루프의 끝을 내리 함수 coroutine 이 완료됩니다. (여기서 일어나는 다양 언어를 기반으로 우리는 이야기에 대해서는 python,그것은 예외가 발생).

하 가지고 이 기능은 C++.

의 두 가지 종류가 있 하;stackful 및 stackless.

A stackless coroutine 을 저장뿐만 아니라 지역 변수의 상태 및 위치의 실행에 있습니다.

A stackful coroutine 저장 전체 스택지(thread).

Stackless 하 될 수 있습니다 매우 가벼운 무게. 마지막 제안 내가 읽고 관련된 기본적으로 재작성 기능으로 무언가를 좋아하는 람다,모든 지역 변수의 상태로체,그리고 라벨은 점프하는 데 사용됩/에 위치 coroutine"생성"중간 결과입니다.

프로세스의 생산 값이라고 합"yield"으로 하는 조금 같은 협력적인 멀티 스레딩;당신은 항복점의 실행하여 발신번호를 입력하실 수 있습니다.

부가 구현 stackful 하;그것은 당신이 함수를 호출하여 수익률습니다. Stackful 하는 더 강력하지만,또한 더 비싸다.


더 많은 하 보다 간단한 발전기입니다. 할 수 있는 기 coroutine 에 coroutine 할 수 있도록 구성 하에서는 유용한 방식이다.

하 같은 경우,루프와 함수 호출,다른 종류의"구조 goto"할 수 있는 익스프레스 특정 유용한 패턴을(상태계)에서는 자연적인 방법입니다.


특정 방식으로 구현하지 못하도록 하는 C++에서는 비 재미있다.

가장 기본적인 수준에서,그것은 추가 몇 가지 키워드 C++:co_return``co_await``co_yield함께 일부 라이브러리는 형식을 그들과 함께 작업 할 수 있습니다.

함수가 coroutine 함으로써 중 하나에서 그들의 몸입니다. 그래서 그들의 선언은 그들이 구별할 수 있습니다 기능.

한 때 사람들의 세 개 키워드는 함수에서 사용되는 몸,일부 표준 규정된 검토의 형식을 반환하고 인수를 발생하고 기능으로 전환 coroutine. 이 검사 컴파일러를 저장할 위치 기능 상태가 기능은 중지됩니다.

가장 간단한 coroutine 발전기:

generator get_integers( int start=0, int step=1 ) {
  for (int current=start; true; current+= step)
    co_yield current;
}

co_yield일시 중단하는 기능,실행 저장하는 상태에서는발전기<int>,그 반환 값이현재을 통해발전기<int>.

반복할 수 있습니다 정수를 반환합니다.

co_await한편할 수 있는 결합 하나 coroutine 에 다른입니다. 는 경우에 한 coroutine 고 당신은 필요한 결과 대기 가능한 것(자주 coroutine)진행하기 전에,당신은co_await니다. 그들은 준비 되어 있는 경우,당신은 즉시 진행되지 않는 경우,일시 중단할 때까지 대기 가능 당신을 기다리고 있에 준비가 된 것입니다.

std::future load_data( std::string resource )
{
  auto handle = co_await open_resouce(resource);
  while( auto line = co_await read_line(handle)) {
    if (std::optional r = parse_data_from_line( line ))
       co_return *r;
  }
  co_return std::unexpected( resource_lacks_data(resource) );
}

load_data은 coroutine 생성하는std::미래의때는 이름 지정된 자원이 열리고 우리는 관리 구문 분석하는 지점에 우리가 발견한 데이터를 요청합니다.

open_resourceread_line 의 아마 async 하는 파일을 열고 읽을 줄다. 는co_await연결을 중단하고 준비 상태의load_data`을 진행 중입니다.

C++하이 훨씬 더 유연한 이보다,그들이 구현되었으로 설정한 최소한의 언어의 기능 최고의 사용자 공간 형식입니다. 사용자 공간에 효과적으로 정의 whatco_return``co_awaitco_yield--I'봤어요 사람들이 그것을 사용하여 구현하 monadic 선택적인 표현은co_await에서 선택적으로 자동 propogates 빈 상태를 외부 선택 사항:

modified_optional add( modified_optional a, modified_optional b ) {
  return (co_await a) + (co_await b);
}

std::optional add( std::optional a, std::optional b ) {
  if (!a) return std::nullopt;
  if (!b) return std::nullopt;
  return *a + *b;
}
해설 (11)

A coroutine 은 C 함수는 여러 반환 문을 때라고 2 시간이 시작되지 않에서 실행을 시작의 기능을 하지만에 첫 번째 명령을 실행 돌아갑니다. 이 실행 위치가 저장과 함께 모든 자동 변수는 라이브 스택에서는 비 coroutine 능합니다.

이전 실험 coroutine 구현에서는 Microsoft did 사용하여 복사 중첩 그래서 당신은 수도에서 깊은 중첩된 기능이다. 하지만 이전에 의해 거부되었다는 C++위원회. 당신이 얻을 수 있는 이 구현에 대한 예와 향상 섬유 라이브러리입니다.

해설 (0)

하이 있어야 할(C++)는 기능을 할 수 있"기"을 위해 몇 가지 다른 일상적인 완료를 제공하는 데 필요한 모든 위해 중단,일시 중지되고,일상적인 하에 이동합니다. 는 기능이 가장 재미있게 C++사람이 하는 것이 이상적으로 취하지 스택에 공간이...C#이미지가 이와 같이 기다리고 수율이 하 C++해야 할 수도 있습을 재건하에 그것을 얻을.

동시점에 크게 초점을 맞추고의 분리가 우려는 우려하는 작업 프로그램을 완료합니다. 이 문제의 분리에 의해 수행할 수 있습의 숫자는 일반적으로 대표단의 일부입니다. 아이디어의 동시성는 다수의 프로세스할 수 있는 독립적으로 실행(별거의 문제)과'수신기'직접 것이 무엇이 생산하는 사람들에 의해 분리된 관심을 어디에 있든 그것은 갈 예정이다. 이것은 크게 의존에서는 어떤 종류의 비동기식 관리. 의 숫자가 접근을 동시성 등의 측면 지향 프로그래밍 및 다른 사람입니다. C#는'대리자'자에 작동합니다.

병렬처럼 들리는 동시성과 관련될 수 있지만 실제로 물리적인 구조와 관련된 많은 프로세서에서 배열이 더 많거나 적은 병렬 패션 소프트웨어와 함께할 수 있는 직접 부분의 코드를 다른 프로세서는 것이 실행하고 그 결과를 받은 후기적입니다.

해설 (1)