Рассмотрим структуру:
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», которое заблокировано другим потоком.
Задача ещё не решена.
Других решений пока нет …