Как правильно использовать пулы потоков Vala? - PullRequest
3 голосов
/ 17 октября 2011

Я пытаюсь использовать GLib.ThreadPool s в Vala, но после поиска в Google Code и существующей документации я не могу найти хороших примеров их использования. Мои собственные попытки их использования приводят к необработанным GLib.ThreadError с.

Например, рассмотрим следующие 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? Спасибо за чтение, и еще раз спасибо, если у вас есть ответ.

edit : Я подумал, что это может быть из-за моего компилятора, но нет, Thread.supported() оценивает здесь как true.

1 Ответ

5 голосов
/ 17 октября 2011

Я не вижу ничего плохого в вашем коде. И предупреждения компилятора о не перехвате 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);
 }
...