🙄

comelangにgoのような並列処理が入りました。

2024/11/17に公開
#include <comelang.h>
#include <comelang-pthread.h>

int fun(int a, int b)
{
    printf("%d %d\n", a, b);
    
    return 3;
}

struct sData
{
    int@ a;
};

int main(int argc, char** argv)
{
    sData data;
    int@ a = __channel__;
    int@ b = __channel__;
    
    var thread = come {
        fun(1, 2);
        a <- 111;
        a <- 222;
    }
    
    b <- 222;
    
    come_join(thread);
    
    come_poll {
        a {
            printf("a %d\n", <-a);
            printf("a %d\n", <-a);
        }
        
        b {
            printf("b %d\n", <-b);
        }
    }
    
    return 0;
}

come { } で並列処理に入ります。come fun(1,2);なども可能です。
{}内では親の関数の変数にもアクセスできます。
come_joinで後片付けします。

come_pollはチャネルの入力待ちを行います。
aに入力があれば<-aでチャネルへの入力が出力されます。
基本的に並列で動いている処理はチャネルを使ってデータの受け渡したほうがいいと思います。
入力があるまで、チャネルはブロックするためタイミングを考えやすいからです。
ただし、ポインタはポインタ自体が渡されます。Seriallizeされているわけではありません。
まあ、同じプロセス間なので問題ないでしょう。

Discussion