3

GLib.ThreadPoolVala で sを使用しようとしていますが、Google Code と既存のドキュメントを検索した後、それらの使用の良い例が見つかりません。私自身がそれらを使用しようとすると、未処理GLib.ThreadErrorの s が発生します。

たとえば、整数範囲の乗算をスレッド化する次の 26 行を考えてみましょう。

threaded_multiply.vala

class Range {
    public int low;
    public int high;

    public Range(int low, int high) {
        this.low = low;
        this.high = high;
    }
}

void multiply_range(Range r) {
    int product = 1;
    for (int i=r.low; i<=r.high; i++)
        product = product * i;
    print("range(%s, %s) = %s\n",
          r.low.to_string(), r.high.to_string(), product.to_string());
}

void main() {
    ThreadPool<Range> threads;
    threads = new ThreadPool<Range>((Func<Range>)multiply_range, 4, true);
    for (int i=1; i<=10; i++)
        threads.push(new Range(i, i+5));
}

それらをコンパイルすると正常にvalac --thread threaded_multipy.vala動作します...しかし、警告が表示されます。マルチスレッドの危険性を考えると、これは私が何か間違ったことをしていると思わせ、最終的に私の顔に爆発するかもしれません.

誰をGLib.ThreadPool正しく使うべきか知っている人はいますか?読んでいただきありがとうございます。回答があればさらに感謝します。

編集: コンパイル マシンのせいかもしれないと思ったのですが、いいえ、Thread.supported()ここでは true と評価されます。

4

1 に答える 1

5

あなたのコードに問題はありません。また、コンパイラの警告は、ThreadErrors をキャッチしないことに関するものです。おそらくすべきことです。次のように try と catch を追加するだけです。

 try {
    threads = new ThreadPool<Range>((Func<Range>)multiply_range, 4, true);
    for (int i=1; i<=10; i++)
    threads.push(new Range(i, i+5));
  }
 catch(ThreadError e) {
    //Error handling
    stdout.printf("%s", e.message);
 }
于 2011-10-17T12:28:12.077 に答える