Как работает блокировка в случае блокировки структуры и поля в структуре?

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

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)

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

0 ответов

Другие вопросы по тегам