У меня есть пул общей памяти, из которого много разных потоков могут запросить выделение. Запрос на выделение из этого будет происходить LOT в каждом потоке, однако количество потоков, вероятно, будет небольшим, часто только с одним запущенным потоком. Я не уверен, какой из следующих способов справиться с этим лучше.
В конечном итоге мне может понадобиться реализовать оба варианта и посмотреть, что дает более благоприятные результаты ... Я также боюсь, что даже думать о # 2 может быть преждевременной оптимизацией на данном этапе, так как на самом деле у меня нет кода, который использует этот общий ресурс написано еще. Но проблема настолько чертовски интересна, что продолжает отвлекать меня от другой работы.
1) Создайте мьютекс и сделайте попытку потока заблокировать его до получения выделения, а затем разблокировать его.
2) Пусть каждый поток регистрирует интервал запроса, когда ему требуется распределение, он помещает запрос в интервал, а затем блокирует (в то время как (result == NULL) {usleep ()}) ожидание, пока интервал запроса не будет иметь результат. Один поток непрерывно выполняет итерации временных интервалов запроса, выделяя их и присваивая результат в слоте запроса.
Номер 1 - простое решение, но один поток потенциально может захватить блокировку, если время выбрано правильно. Второй является более сложным, но обеспечивает справедливость среди потоков при извлечении из ресурса. Однако он по-прежнему блокирует запрашивающие потоки, и если имеется много потоков, итерация может записывать циклы без выполнения каких-либо фактических распределений, пока не найдет запрос на выполнение.
ПРИМЕЧАНИЕ: C в Linux с использованием pthreads