Вопрос по soap, c++, pthreads, openssl, multithreading – Использование OpenSSL в многопоточном приложении

2

Я писал клиентское приложение SOAP на C ++ в Ubuntu, используя OpenSSL для моего транспорта HTTPS и pthreads для потоков. У меня есть несколько потоков - один центральный поток сбора данных, который периодически получает рабочие потоки для выполнения запросов SOAP через общие очереди, защищенные мьютексами.

Читая документацию по OpenSSL я нашелOpenSSL поточно-ориентирован? в FAQ по OpenSSL, в котором описаны механизмы, необходимые для обеспечения безопасности потоков при использовании OpenSSL. Я реализовал это, и все работает отлично.

Причиной моего вопроса на самом деле является концептуальная трудность. Я думал о реализации той же функциональности, что и мое приложение, но вместо использования потоков я бы создал 2 отдельныхapplications Один для рабочего потока (из которых будет запущено несколько копий), а другой для основного потока сбора данных. Затем я бы использовал TCP-сокеты для связи между двумя, а не мьютекс-защищенными очередями. Это может быть плохой идеей, но это не очень важно - меня смущает то, чтоwould I have to implement the same functions required to ensure OpenSSL thread safety in this second approach or not?

Я предполагаю, что мне это не нужно, и они могут рассматриваться как независимые (действительно, наверняка, так должно быть, так как многие приложения используют OpenSSL), но в чем причина этого?What is different between multiple applications using shared library code and multiple threads sharing the same code??  Уже несколько лет я успешно пишу многопоточные приложения, и меня беспокоит, что я не могу найти ответ на этот вопрос.

Ваш Ответ

2   ответа
2

Разница в том, что когда несколькоthreads совместно используют один и тот же код библиотеки, они также используют одни и те же глобальные структуры данных; когда несколько процессов совместно используют этот библиотечный код, они не получают.

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

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

Большое спасибо - это именно то объяснение, которое я искал !! mathematician1975
0

Я думаю, главное отличие в том, что вmultiple threads sharing the same codeпри необходимости можно выполнить синхронизацию, тогда как вmultiple applications using shared library code это не легко возможно, кроме как с такими механизмами, как блокировка файлов. Кроме того, будет значительный прирост производительности.

Рассмотрим, например, приложение, которое содержитdisplay(msg) метод, который просто пишет на экран, и main (), который вызывает display (msg). Если естьfive threads вызывая этот метод, мы сможем синхронизировать вызовы, чтобы вывод не искажался. Однако, если метод отображения (MSG) был реализован вfive different applications и TCP-сокеты использовались для отправки сообщения из основного приложения, вывод будет искажен.

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

На самом деле я буду придерживаться своего многопоточного приложения. Мне просто трудно увидеть различие между 5 потоками с отдельным соединением, каждый из которых нуждается в собственном написанном коде блокировки для OpenSSL, но 5 отдельных процессов, каждый с отдельным соединением, не требует этого. mathematician1975
Я нашел проблему очень интересной. Во всех известных мне ситуациях, когда используется многопоточность, блокировка требуется, только если потоки конкурируют за ресурс. Так что эта ситуация является исключением. Поскольку они являются отдельными соединениями, OpenSSL должен иметь возможность обрабатывать их, и в этом заключается проблема. Если вы на самом деле сравниваете производительность обоих случаев, пожалуйста, сделайте обновление.

Похожие вопросы