31.19. Ðоведение в многопоÑоÑнÑÑ Ð¿ÑогÑаммаÑ
ÐиблиоÑека libpq по ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾Ð²ÑоÑнÑе вÑÐ·Ð¾Ð²Ñ Ð¸ многопоÑоÑноÑÑÑ. ÐÐ»Ñ ÑооÑвеÑÑÑвÑÑÑего ваÑианÑа ÑбоÑки ваÑего пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð²Ð°Ð¼ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð½Ð°Ð´Ð¾Ð±Ð¸ÑÑÑÑ Ð¿ÐµÑедаÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑоÑÑ ÑпеÑиалÑнÑе паÑамеÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð¹ ÑÑÑоки. ЧÑÐ¾Ð±Ñ ÑзнаÑÑ, как ÑобÑаÑÑ Ð¼Ð½Ð¾Ð³Ð¾Ð¿Ð¾ÑоÑное пÑиложение, обÑаÑиÑеÑÑ Ðº докÑменÑаÑии ваÑей ÑиÑÑÐµÐ¼Ñ Ð¸Ð»Ð¸ поиÑиÑе в Ñайле src/Makefile.global знаÑÐµÐ½Ð¸Ñ PTHREAD_CFLAGS и PTHREAD_LIBS. ÐÑа ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ ÑзнаÑÑ, поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð»Ð¸ libpq многопоÑоÑноÑÑÑ:
РеализаÑÐ¸Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð¿Ð¾ÑоÑноÑÑи не лиÑена огÑаниÑений: два поÑока не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑÑаÑÑÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно ÑабоÑаÑÑ Ñ Ð¾Ð´Ð½Ð¸Ð¼ обÑекÑом PGconn. Ð ÑаÑÑноÑÑи, не допÑÑкаеÑÑÑ Ð¿Ð°ÑаллелÑное вÑполнение команд из ÑазнÑÑ
поÑоков ÑеÑез один обÑÐµÐºÑ ÑоединениÑ. (ÐÑли вам нÑжно вÑполнÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¾Ð´Ð½Ð¾Ð²Ñеменно, иÑполÑзÑйÑе неÑколÑко Ñоединений.)
ÐбÑекÑÑ PGresult поÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑÑно доÑÑÑÐ¿Ð½Ñ ÑолÑко Ð´Ð»Ñ ÑÑениÑ, и поÑÑÐ¾Ð¼Ñ Ð¸Ñ
можно Ñвободно пеÑедаваÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð¿Ð¾Ñоками. Ðднако, еÑли Ð²Ñ Ð¸ÑполÑзÑеÑе какÑÑ-либо из ÑÑнкÑий, изменÑÑÑиÑ
PGresult, опиÑаннÑÑ
в Разделе 31.11 или Разделе 31.13, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ñакже избегаÑÑ Ð¾Ð´Ð½Ð¾Ð²ÑеменнÑÑ
обÑаÑений к Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ PGresult.
УÑÑаÑевÑие ÑÑнкÑии PQrequestCancel и PQoidStatus не ÑвлÑÑÑÑÑ Ð¿Ð¾ÑокобезопаÑнÑми и не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑименÑÑÑÑÑ Ð² многопоÑоÑнÑÑ
пÑогÑаммаÑ
. ÐмеÑÑо PQrequestCancel можно иÑполÑзоваÑÑ PQcancel, а вмеÑÑо PQoidStatus â PQoidValue.
ÐÑли Ð²Ñ Ð¿ÑименÑеÑе Kerberos в ÑвоÑм пÑиложении (помимо возможного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð½ÑÑÑи libpq), Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð±ÐµÑпеÑиÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ð²Ð¾ÐºÑÑг вÑзовов Kerberos, Ñак как ÑÑнкÑии Kerberos не ÑвлÑÑÑÑÑ Ð¿Ð¾ÑокобезопаÑнÑми. ÐбÑаÑиÑе внимание на ÑÑнкÑÐ¸Ñ PQregisterThreadLock в иÑÑ
одном коде libpq, позволÑÑÑÑÑ Ð¾ÑганизоваÑÑ ÑовмеÑÑнÑе блокиÑовки Ð¼ÐµÐ¶Ð´Ñ libpq и ваÑим пÑиложением.
ÐÑли Ð²Ñ ÑÑалкиваеÑеÑÑ Ñ Ð¿Ñоблемами многопоÑоÑноÑÑи в пÑиложениÑÑ
, запÑÑÑиÑе пÑогÑÐ°Ð¼Ð¼Ñ src/tools/thread, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð½ÑÑÑ, еÑÑÑ Ð»Ð¸ в ваÑей ÑиÑÑеме небезопаÑнÑе пÑи многопоÑоÑноÑÑи ÑÑнкÑии. ÐÑа пÑогÑамма запÑÑкаеÑÑÑ ÑкÑипÑом configure, но еÑли Ð²Ñ ÑÑÑанавливаеÑе двоиÑнÑй пакеÑ, ваÑи библиоÑеки могÑÑ Ð½Ðµ ÑооÑвеÑÑÑвоваÑÑ Ñем, ÑÑо иÑполÑзовалиÑÑ Ð¿Ñи ÑбоÑке.