Menu

메시지 패싱(Message Passing)

쓰레드를 사용하며, 쓰레드 사이의 동기화에 고민하는 대신 메시지 패싱(message passing) 을 사용하여 다중 CPU 코어를 충분히 활용해보십시오.

이 방법을 사용하면, 쓰레드 사이에서 메시지 로 통신을 하게 되는데, 이 메시지에는 D 언어에서 다룰 수 있는 임의의 값이 담겨있게 됩니다. 이를 이용해 의미 있는 값을 전달하여 작업을 분배하거나, 쓰레드 사이의 동작 순서 등을 결정할 수 있습니다.

D 언어의 쓰레드는 다중 쓰레드 프로그래밍을 할 때 발생할 수 있는 여러 문제를 회피하기 위해, 가능한 변수 등을 공유하지 않도록 설계되어있습니다.

메시지 패싱에 사용되는 모든 표준 함수들은 std.concurrency 표준 라이브러리 패키지에 정의되어있습니다. spwan 으로 새 쓰레드 를 만들 때, 쓰레드 내에서 어떤 함수를 실행할지 프로그래머가 지정해주어야합니다.

    auto threadId = spawn(&foo, thisTid);

thisTidstd.concurrency 가 기본으로 제공해주는, 메시지를 받길 기다리는 쓰레드에 대한 참조입니다.

spawn 은 첫번째 입력값으로 함수를 받으며, 이후에 첫번째 입력값에 제공된 함수를 실행하는데 필요한 입력값들을 매개변수로 받습니다.

    void foo(Tid parentTid) {
        receive(
          (int i) { writeln("An ", i, " was sent!"); }
        );

        send(parentTid, "Done");
    }

receive 라는 함수가 보이는데, 이 함수는 switch-case 처럼 사용할 수 있는 함수입니다.

이 함수는 다른 쓰레드에서 전달된 값을 처리하는 델리게이트(delegate) 로써, 메시지를 보내는 쓰레드가 몇 개의 값을 보내느냐, 각 값의 타입은 어떻게 되는지에 따라 실행여부가 결정됩니다.

특정 쓰레드에게 메시지를 전달하려면 send 라는 함수를 사용하고, 메시지를 받을 쓰레드 아이디를 함께 입력값으로 제공해야합니다.

    send(threadId, 42);

receiveOnly 는 지정된 한 타입의 한 가지 값만 받을 때 사용됩니다.

    string text = receiveOnly!string();
    assert(text == "Done");

receivereceive 로 시작되는 메시지 패싱 관련 함수들은, 원하는 메시지가 도착할 때까지 쓰레드를 일시 정지시키는 효과를 가지고 있습니다.

더 살펴보기

rdmd playground.d