Где я должен поставить "exec this, когда задания 1 .. n выполнены?" - PullRequest
0 голосов
/ 02 сентября 2011

У меня есть некоторый параллельный код и пул потоков.

Я отправляю группы заданий для завершения, и мне нужно отправить 15 заданий, скажем, и , когда все 15 завершены , это специальное задание "задание 16" должно быть выполнено.

Вы не можете просто ставить в очередь «задание 16» последним и иметь пул потоков «exec, когда будете готовы», потому что он может запустить exec «задания 16» до того, как задания 13, 14, 15 будут выполнены.

Итак, , вам нужен способ считать. У меня вопрос, , где ответственность принадлежит?

  • В коде вызова : Используйте статическую / глобальную переменную, которая увеличивается в конце каждого задания. Вакансии 1-15 до counter++. Когда counter == 15, exec job 16
  • В пуле потоков : добавить функциональность в пул потоков для выполнения ", если не отправлено ни одного задания до того, как (отметка времени) останется"
  • В обратном вызове : (ответственность за проверку выполнения заданий 1-15, вращение / сон в противном случае)

Ответы [ 2 ]

1 голос
/ 02 сентября 2011

Вы можете также рассмотреть возможность инкапсуляции этого поведения в своем собственном классе и вызвать событие, когда ваши задания завершатся, чтобы вызвать постановку в очередь вашей 16-й задачи, например:

internal class ParallelBatchRunner
{
    public event EventHandler Completed = delegate { };

    public void Run(List<Action> tasks)
    {
        int count = tasks.Count;

        tasks.ForEach(t =>
        {
            Action completionTask = () =>
            {
                t();

                if (Interlocked.Decrement(ref count) == 0)
                {
                    Completed(this, EventArgs.Empty);
                }
            };

            ThreadPool.QueueUserWorkItem(_ => completionTask());
        });
    }
}
0 голосов
/ 02 сентября 2011

Я предпочитаю 1-й подход.

Помимо подхода к подсчету, вы можете использовать массив ManualResetEvent [] для синхронизации 16-го задания с 15 оставшимися заданиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...