Добрый день!<br>Написал и использую модуль для ограничения количества запросов к серверу за промежуток времени с одного IP. Данные организованы следующим образом: в разделяемой памяти хранятся связанные списки структур статистики по ip адресам, нужная строка выбирается простой хеширующей функцией от ip адреса. Соответсвенно там происходит выделение и освобождение памяти. Для защиты указателей списка во время поиска по строке я использую pthread_mutex_lock на строку. Чтобы понятнее было:<br>
..<br>addr = ((struct sockaddr_in *) (r-&gt;connection-&gt;sockaddr))-&gt;sin_addr.s_addr;<br>key = rlimit_hash_key(addr, ..);<br>..<br>pthread_mutex_lock(&amp;ctx-&gt;hash_locks[key]);<br>..<br>тут ищем статистику, в общем шаримся по разделяемой памяти<br>
..<br>ret = check_node(..);<br>pthread_mutex_unlock(&amp;ctx-&gt;hash_locks[key]);<br>return ret;<br><br>Обработчик устанавливается через:<br>..<br>h = ngx_array_push(&amp;cmcf-&gt;phases[NGX_HTTP_PREACCESS_PHASE].handlers);<br>
..<br><br>Собственно вопрос в чем. Я печатаю статистику работы модуля и число процессов в критическом интервале все время равно нулю, несмотря на довольно значительную загрузку сервера. У меня складывается ощущение, что я чего-то не понимаю. <br>
То ли вообще нет необходимости в защите разделяемой памяти в этом месте, то ли это специфично только для freeBSD. Под Linux, увы, нет достаточно нагруженного сервера.<br>Собственно вопрос, нужно ли здесь взаимное исключение процессов (нитей)?<br>
С уважением, Александр<br>P.S. Если все таки нужно, не имеет ли смысл переделать на, скажем, семафоры?<br>