C++ - потоки и несколько очередей

для python 3.6, у меня сработало следующее: запусти cmd.exe в качестве администратора

pip install numpy-1.13.0+mkl-cp36-cp36m-win32 pip install scipy-0.19.1-cp36-cp36m-win32

5
задан sth 22 May 2009 в 17:01
поделиться

7 ответов

Вы можете использовать условную переменную . Попросите ваши рабочие потоки ждать переменной условия. Когда задание добавляется в любую из очередей заданий, сигнализируйте переменную условия. Затем, когда рабочий поток просыпается, он проверяет очереди, в которых он ожидает. Если у кого-то из них есть работа, он снимает ее с очереди. В противном случае он возвращается к ожиданию переменной условия. Ожидание переменной условия переводит поток в спящий режим, поэтому он не потребляет процессорное время.

Само собой разумеется, что вы должны защищать все обращения к очередям заданий с помощью мьютекса (например, pthread_mutex_t ]).

4
ответ дан 13 December 2019 в 22:15
поделиться

Как насчет:

  • все рабочие потоки ждут семафора
  • , когда что-либо добавляется в очередь, семафор увеличивается,
5
ответ дан 13 December 2019 в 22:15
поделиться

Если для каждой очереди не слишком много рабочих, вы можете создать переменную условия для каждого рабочего.

1
ответ дан 13 December 2019 в 22:15
поделиться

Я бы использовал boost :: asio для постановки данных в очередь, чтобы ваши многочисленные потоки могли это сделать. Вы можете передать ссылку в очередь с помощью команды post и соответствующим образом обработать поток.

0
ответ дан 13 December 2019 в 22:15
поделиться

Вместо того, чтобы иметь отдельную блокировку для каждой очереди, почему бы не иметь одну блокировку для всей очереди?

  1. Дождитесь блокировки
  2. Получите блокировку
  3. Удалите из любой очереди
  4. Снять блокировку
  5. Обработка исключенного из очереди элемента
  6. Перейти к шагу 1

Предполагая, что удаление из очереди занимает незначительное время (так что блокировка удерживается только в течение незначительного времени), может не потребоваться более одной блокировки.

0
ответ дан 13 December 2019 в 22:15
поделиться

Вы можете сделать что-то вроде этого: каждое задание имеет связанную с ним «очередь». Например:

Допустим, у вас 2 очереди. Ваша работа могла бы сказать:

job[0].queue = 1; /* That job is in queue 1 */
job[1].queue = 1;
job[2].queue = 2; /* this job is in queue 2 */
... 
etc

Итак, у вас есть «мешок с нитками». Поток просто выбирает работу - скажем, job [2]. Если этому потоку разрешено обрабатывать задания только из очереди 1, то он помещает это задание обратно в очередь готовности и выбирает другое задание.

Таким образом, каждый поток знает, какие очереди ему разрешено обрабатывать, и когда он выбирает задание. , он проверяет соответствие поля «очередь» задания. Если это не так, он выбирает другое задание.

(во многих отношениях планирование процессов работает в Linux на нескольких ядрах. У каждого процесса есть битовая маска, указывающая, на каких процессорах ему разрешено работать, а затем процессор перед тем, как сделать это, убедитесь, что этот процесс «разрешен».

0
ответ дан 13 December 2019 в 22:15
поделиться

Похоже, вам следует использовать boost :: thread , boost :: condition и std :: queue .

0
ответ дан 13 December 2019 в 22:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: