Лучше заблокировать общий ресурс или иметь поток для выполнения запросов? - PullRequest
0 голосов
/ 08 августа 2011

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

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

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

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

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

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

1 Ответ

6 голосов
/ 08 августа 2011

Решение 2 является поддельным.Это уродливый хак, и он не обеспечивает синхронизацию памяти.

Я бы сказал, перейдите к решению 1, но я немного скептически отношусь к тому факту, что вы упомянули «пул памяти» для начала.Вы просто пытаетесь выделить память, или есть какой-то другой ресурс, которым вы управляете (например, слоты в каком-то особом виде памяти, отображенный в памяти файл, текстуры в видеопамяти и т. Д.)?

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

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

...