может ли использование условных переменных (POSIX concurrent api) действительно замедлить мой параллельный сетевой код? - PullRequest
0 голосов
/ 13 февраля 2012

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

Проблема: чтобы использовать функцию signal в API POSIX, я должен использовать мьютекс. Это означает, что если 2 сетевых потока получают данные одновременно, им придется ждать освобождения мьютекса, чтобы продолжить выполнение.

Реально, будет ли использование этой условной переменной действительно замедлять мой код? Я также могу, если не хочу его использовать, создать в другом потоке (который вызывает wait для условной переменной) инструкцию while, которая зацикливается, чтобы увидеть, получили ли мои сетевые потоки что-то.

Большое спасибо:)

1 Ответ

0 голосов
/ 13 февраля 2012

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

Теоретически вы можете заменить ожидание переменной условия циклом while, опрашивающим флаг, но затем вы должны убедиться, что используете правильную синхронизацию (барьеры памяти) при доступе к этому флагу. Это также будет стоить. Оживленное ожидание также не является идеальным по разным причинам, и добавление режима ожидания приведет к задержке.

...