Рассмотрим структуру:
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», заблокированное другим потоком.