Vala线程池的正确用法是什么?

时间:2011-10-16 23:08:18

标签: multithreading threadpool compiler-warnings glib vala

我正在尝试在Vala中使用GLib.ThreadPool,但在搜索Google Code和the existing documentation之后,我找不到任何好用的例子。我自己尝试使用它们导致未处理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()在这里评估为真。

1 个答案:

答案 0 :(得分:5)

我认为您的代码没有任何问题。编译器警告是关于不捕获ThreadErrors。你可能应该做什么。只需添加一个尝试并抓住这样:

 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);
 }