Извините, мне кажется, не получается intel's TBB кажется отличным & поддерживается, но я не могу окунуться в голову, как его использовать, так как я думаю, что я не привык думать о параллелизме с точки зрения задач, но вместо этого видел его как нитки.TBB для рабочей нагрузки, которая продолжает меняться?
В моей рабочей нагрузке есть работа, которая отправляет работу в очередь для продолжения обработки (подумайте о рекурсии, но вместо того, чтобы называть себя, она отправляет работу в очередь). Способ, которым я работал на Java, заключался в создании параллельной очереди (неблокирующей очереди) и threadpoolexecutor, которая работала над работой очереди/отправки. Но теперь я пытаюсь сделать что-то подобное в C++, я обнаружил, что TBB может создавать пулы, но его подход очень отличается (потоки Java, похоже, продолжают работать до тех пор, пока они работают в очереди, но TBB, похоже, нарушает задачу в начале).
Вот простой Java пример того, что я делаю (до этого я установил, сколько потоков я хочу, и т.д ..):
static class DoWork implements Callable<Void> {
// queue with contexts to process
private Queue<int> contexts;
DoWork(Context request) {
contexts = new ArrayDeque<int>();
contexts.add(request);
}
public Void call() {
while(!contexts.isEmpty()) {
//do work
contexts.add(new int(data)); //if needs to be send back to the queue to do more work
}
}
}
Я уверен, что его можно сделать это в TBB, но я просто не уверен, как, потому что он, кажется, разбивает мою работу в то время, когда я ее отправляю. Поэтому, если в очереди есть 2 элемента, он может запускать только 2 потока, но не будет расти по мере поступления большего количества работы (даже если у меня есть 8 ядер).
Может кто-нибудь помочь мне понять, как достичь моих задач, а также предложить лучший способ думать о TBB, исходящий из среды потоковой передачи Java (также у меня нет верности TBB, поэтому, если есть что-то более простое/лучшее, Я с удовольствием узнаю об этом. Мне просто не нравится C++ threadpool, потому что он, похоже, не активно развивается)?
Что такое тип данных Context? Первоначально был класс DoWork '? –
moshbear
@moshbear для простоты, я просто сделал это int в примере. когда я действительно это делаю, это int и список. извините, должен был просто включить его int в примере. – Lostsoul
Настоящий STL перевод вашего кода: http://codepad.org/vs4S1UtB. Вы должны идти оттуда. – moshbear