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