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

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

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

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]