Лучше заблокировать общий ресурс или иметь поток для выполнения запросов?

У меня есть общий пул памяти, из которого множество разных потоков могут запрашивать выделение. Запрос на выделение от этого будет происходить МНОГО в каждом потоке, однако количество потоков, вероятно, будет небольшим, часто только с одним запущенным потоком. Я не уверен, какой из следующих способов справиться с этим лучше.

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

1) Создайте мьютекс и попросите поток попытаться заблокировать его перед получением выделения, а затем разблокировать его.

2) Пусть каждый thread регистрирует слот запроса, когда ему требуется выделение, он помещает запрос в слот, а затем блокирует (while (result == NULL) {usleep ()}), ожидая, пока слот запроса не получит результат. Один поток непрерывно выполняет итерацию слотов запроса, выделяя и присваивая их результату в слоте запроса.

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

ПРИМЕЧАНИЕ: C в Linux использует pthreads

0
задан Exodist 7 August 2011 в 20:22
поделиться