Nimのthread間で変数を共有する

この記事の目次
chevron_right コード
chevron_right 実行

nimでthread間で変数の値を共有したいことがあります。
それがintならいいのですが、なんとnimではstringなどのポインタはうまく共有できません(実行時エラーになります)

ではどうやるか?

「Channel」という機能を利用していきます。

ではやってきましょうか。

コード

import os

# チャンネル変数(入ってくるのはstring型)を作成します
var channelData: Channel[string]

proc threadFunc1() =
    ##
    ## thread(サブスレッド)で実行される非同期関数
    ## メッセージを別スレッドに向けて送信するサンプル関数です
    ##

    for num in 0..10:
        # 0~10を文字列として別スレッドに共有します
        channelData.send($num)

        # 0.1秒間待機
        sleep(100)


proc threadFunc2() =
    ##
    ## thread(サブスレッド)で実行される非同期関数
    ## メッセージを別スレッドから受信するサンプルです
    ##

    # 11個のデータを受信したらThreadを終了できるように
    var num = 0

    while true:
        # チャンネルからデータを取得
        # (データが来るまでひたすら待機するようなので不要になったらloopをbreakする必要がある)
        echo channelData.recv()

        num = num + 1
        if num >= 11:
            break

# チャンネルを作成(オープン)する
channelData.open()

# threadの開始
var thread1: Thread[void]
var thread2: Thread[void]
createThread(thread1, threadFunc1)
createThread(thread2, threadFunc2)

# サブスレッドの処理が終了するまでメインスレッドを終了させない
joinThreads(thread1)
joinThreads(thread2)

sleep(3000)

実行

nim c --threads:on -r 保存ファイル名.nim

まあ多分、コードを読んでいただければわかると思いますので、
詳細は割愛。

[PR] おすすめの本
この記事を書いた人
Nな人(えぬなひと)。
Nは本名から取っています。
Laravelが大好きなPHPerで、WEBを作るときはLaravelを技術スタックに絶対推すマン。
PHP、Pythonと、昔はperlを書いていたP言語エンジニア。
最近はNimを書いたりしています。