Самый быстрый способ ожидания при конфликте потоков - PullRequest
2 голосов
/ 21 января 2012

Я использую pthread в Linux.У меня есть круговой буфер для передачи данных из одного потока в другой.Возможно, циклический буфер - не лучшая структура для использования здесь, но изменение, которое не устранит мою проблему, поэтому мы просто будем ссылаться на него как на очередь.

Всякий раз, когда моя очередь либо заполнена, либо пуста,операции pop / push возвращают NULL.Это проблематично, так как мои потоки запускаются периодически.Ожидание другого цикла потока заняло бы слишком много времени.

Я пытался использовать семафоры (sem_post, sem_wait), но разблокировка при конфликте занимает до 25 мс, что примерно соответствует скорости моего цикла.Я пытался ждать с pthread_cond_t, но разблокировка занимает от 10 до 15 мс.

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

EDIT *

Хорошо, я использовал условные переменные.Я на встраиваемом устройстве, поэтому добавить «больше ядер или процессор» не вариант.Это заставило меня осознать, что повсюду были установлены всевозможные приоритеты потоков, поэтому я разберусь с этим, прежде чем идти дальше

1 Ответ

4 голосов
/ 21 января 2012

Вы должны использовать условные переменные. Единственные более быстрые способы зависят от платформы, и они ничтожно быстрее.

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

Но эти задержки на самом деле хорошие вещи, и вы не должны беспокоиться о них. Другие потоки тоже могут запускаться.

...