Как работает блокировка в случае блокировки структуры и поля в структуре? - PullRequest
0 голосов
/ 07 октября 2018

Рассмотрим структуру:

struct ns_server {
    unsigned int            magic;
    isc_mem_t *             mctx;
    ns_interfacemgr *    interfacemgr;

    isc_task_t *            task;
    isc_quota_t             xfroutquota;
    isc_quota_t             tcpquota;
    isc_quota_t             recursionquota; }

Теперь рассмотрим другую структуру:

struct ns_interfacemgr {
    unsigned int            magic;          /*%< Magic number. */
    int                     references;
    isc_mutex_t             lock;
    isc_mem_t *             mctx;           /*%< Memory context. */
    isc_taskmgr_t *         taskmgr;        /*%< Task manager. */
    isc_socketmgr_t *       socketmgr;      /*%< Socket manager. */
    dns_dispatchmgr_t *     dispatchmgr;
    unsigned int            generation;     /*%< Current generation no. */
    ns_listenlist_t *       listenon4;
}

Теперь, если переменная типа "ns_server" используется в одном потоке и заблокирована.Теперь, в другом потоке, если используется переменная типа "ns_interfacemgr", которая взята из "(& ns_server) -> interfacemgr".

Скажем, первый поток работает внутри этого блока:

result = isc_task_beginexclusive(server->task);
//server (type ns_server) is modified
isc_task_endexclusive(server->task);

И я беру блокировку на втором потоке как: *

LOCK(&mgr->lock)
//mgr (type ns_interface_mgr ) is modfied
UNLOCK(&mgr->lock)

Мой вопрос: возможно ли, что хотя "server" находится внутри вышеуказанного блока, может ли mgr перейти в LOCK?'блок'.Или, если «mgr» находится в блоке LOCK, может ли «сервер» изменить свое поле «interfacemgr», заблокированное другим потоком.

...