33.20. Ðоведение в многопоÑоÑнÑÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ð°Ñ #
ÐиблиоÑека libpq по ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾Ð²ÑоÑнÑе вÑÐ·Ð¾Ð²Ñ Ð¸ многопоÑоÑноÑÑÑ. ÐÐ»Ñ ÑооÑвеÑÑÑвÑÑÑего ваÑианÑа ÑбоÑки ваÑего пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð²Ð°Ð¼ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð½Ð°Ð´Ð¾Ð±Ð¸ÑÑÑÑ Ð¿ÐµÑедаÑÑ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑоÑÑ ÑпеÑиалÑнÑе паÑамеÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð¹ ÑÑÑоки. ЧÑÐ¾Ð±Ñ ÑзнаÑÑ, как ÑобÑаÑÑ Ð¼Ð½Ð¾Ð³Ð¾Ð¿Ð¾ÑоÑное пÑиложение, обÑаÑиÑеÑÑ Ðº докÑменÑаÑии ваÑей ÑиÑÑемÑ. ÐÑа ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ ÑзнаÑÑ, поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð»Ð¸ libpq многопоÑоÑноÑÑÑ:
PQisthreadsafe#ÐозвÑаÑÐ°ÐµÑ ÑоÑÑоÑние поÑокобезопаÑноÑÑи в библиоÑеке libpq.
int PQisthreadsafe();
ÐозвÑаÑÐ°ÐµÑ 1, еÑли библиоÑека libpq поÑокобезопаÑнаÑ, или 0 в пÑоÑивном ÑлÑÑае.
РеализаÑÐ¸Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð¿Ð¾ÑоÑноÑÑи не лиÑена огÑаниÑений: два поÑока не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑÑаÑÑÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно ÑабоÑаÑÑ Ñ Ð¾Ð´Ð½Ð¸Ð¼ обÑекÑом PGconn. Ð ÑаÑÑноÑÑи, не допÑÑкаеÑÑÑ Ð¿Ð°ÑаллелÑное вÑполнение команд из ÑазнÑÑ
поÑоков ÑеÑез один обÑÐµÐºÑ ÑоединениÑ. (ÐÑли вам нÑжно вÑполнÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¾Ð´Ð½Ð¾Ð²Ñеменно, иÑполÑзÑйÑе неÑколÑко Ñоединений.)
ÐбÑекÑÑ PGresult поÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑÑно доÑÑÑÐ¿Ð½Ñ ÑолÑко Ð´Ð»Ñ ÑÑениÑ, и поÑÑÐ¾Ð¼Ñ Ð¸Ñ
можно Ñвободно пеÑедаваÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð¿Ð¾Ñоками. Ðднако еÑли Ð²Ñ Ð¸ÑполÑзÑеÑе какÑÑ-либо из ÑÑнкÑий, изменÑÑÑиÑ
PGresult, опиÑаннÑÑ
в Разделе 33.12 или Разделе 33.14, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ñакже избегаÑÑ Ð¾Ð´Ð½Ð¾Ð²ÑеменнÑÑ
обÑаÑений к Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ PGresult.
УÑÑаÑевÑие ÑÑнкÑии PQrequestCancel и PQoidStatus не ÑвлÑÑÑÑÑ Ð¿Ð¾ÑокобезопаÑнÑми и не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑименÑÑÑÑÑ Ð² многопоÑоÑнÑÑ
пÑогÑаммаÑ
. ÐмеÑÑо PQrequestCancel можно иÑполÑзоваÑÑ PQcancel, а вмеÑÑо PQoidStatus â PQoidValue.
ÐÑли пÑоÑокол Kerberos пÑименÑеÑÑÑ Ð² полÑзоваÑелÑÑком пÑиложении (помимо возможного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð½ÑÑÑи libpq), Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ обеÑпеÑиÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ð²Ð¾ÐºÑÑг вÑзовов Kerberos, Ñак как его ÑÑнкÑии не ÑвлÑÑÑÑÑ Ð¿Ð¾ÑокобезопаÑнÑми.