У меня есть общий пул памяти, из которого многие разные потоки могут запрашивать выделение. Запрос выделения из этого будет происходить МНОГО в каждом потоке, однако количество потоков, вероятно, будет небольшим, часто с запущенным только 1 потоком. Я не уверен, какой из следующих способов справиться с этим лучше.
В конечном счете, мне, возможно, придется реализовать оба и посмотреть, что дает более благоприятные результаты... Я также боюсь, что даже мысль о № 2 может быть преждевременной оптимизацией на данном этапе, поскольку на самом деле у меня еще нет кода, который использует этот общий ресурс. написанный. Но проблема настолько чертовски интересна, что продолжает отвлекать меня от другой работы.
1) Создайте мьютекс и попросите поток заблокировать его, прежде чем получить выделение, а затем разблокировать его.
2) Пусть каждый поток регистрирует слот запроса, когда ему требуется выделение, он помещает запрос в слот, а затем блокирует (пока (результат == NULL) { usleep() }), ожидая, пока слот запроса будет иметь результат. Один поток непрерывно повторяет слоты запросов, делая распределения и присваивая их результату в слоте запроса.
Номер 1 — это простое решение, но один поток потенциально может заблокировать блокировку, если время выбрано правильно. Второй более сложен, но обеспечивает равноправие между потоками при извлечении из ресурса. Однако он по-прежнему блокирует запрашивающие потоки, и если потоков много, итерация может сжигать циклы без каких-либо фактических распределений, пока не будет найден запрос для выполнения.
ПРИМЕЧАНИЕ. C в Linux с использованием pthreads
usleep()
(которая принимает аргумент, кстати) говорит, что она приостанавливает вызывающий процесс. - person Keith Thompson   schedule 08.08.2011usleep
находится здесь: pubs.opengroup.org/onlinepubs/009695399/ functions/usleep.html - person R.. GitHub STOP HELPING ICE   schedule 08.08.2011usleep
был удален из POSIX в последней редакции, а в предыдущей версии он уже был помечен как устаревший. Вместо этого для современных приложений следует использоватьnanosleep
. - person R.. GitHub STOP HELPING ICE   schedule 08.08.2011