Действительно ли возможно создать мертвую блокировку с доступом только для чтения?

Это нормальное поведение. Вы используете петлевой IP-адрес для сетевых коммуникаций между приложением UWP и другим процессом (другим приложением UWP или настольным приложением). Это ограничено изоляцией сети.

Вы можете запустить свой сервер и клиент на другом компьютере для тестирования. См. Документ Как включить обратную связь и устранить проблемы изоляции сети (приложения Windows Runtime) . Он объяснил этот сценарий:

Loopback разрешен только для целей разработки. Использование приложением среды выполнения Windows, установленным вне Visual Studio, не допускается. Кроме того, приложение среды выполнения Windows может использовать петлю IP-адреса только в качестве целевого адреса для запроса клиентской сети. Поэтому приложение времени выполнения Windows, которое использует DatagramSocket или StreamSocketListener для прослушивания IP-адреса обратной связи, не получает никаких входящих пакетов.

blockquote>

В вашем случае, если вы просто хотите проверить, может ли приложение UWP успешно отправить сообщение вашему подписчику Python. Вы можете запустить приложение UWP на другом компьютере. Я использовал ваш код для создания приложения UWP для отправки сообщения и создания консольного приложения в качестве подписчика, которое запускается на другом компьютере. Консольное приложение может получить сообщение.

Обратите внимание, что поскольку вашему приложению UWP требуется доступ к сети во время выполнения, вам необходимо включить возможности Netwrok (Internet(Client) Internet(Client & Server) Private Networks(Client & Server)) в файле Package.appxmanifest.

8
задан Daniel Rikowski 15 June 2009 в 15:02
поделиться

8 ответов

Интересно - вы пытаетесь создать вектор или список неполного типа. Беглый взгляд на стандарт, я не могу найти ничего, говорящего о том, разрешено это или не должно быть разрешено для типов контейнеров, включенных в стандартную библиотеку C ++. Любое решение могло бы показаться разумным:

Почему это может быть запрещено: Вы не можете объявить объект типа X внутри определения X .

Например, следующий код не может быть скомпилирован, потому что он создает бесконечно глубокую структуру данных:

struct X {
    X x;
};

Почему это может быть разрешено: Размер большинства контейнеров можно изменять, что требует определенного уровня косвенности (указатели) на фактические элементы данных на практике. Это' s законно объявить указатель на- X внутри определения X .

Как следует из последнего абзаца, обычный способ обойти эту проблему - использовать указатели или ссылки на X . Например, следующие два фрагмента компилируются нормально:

struct Y {
    Y* y;
};

struct Z {
    std::list<Z*> zl;
    std::vector<Z*> zv;
};

Кто-нибудь (хорошо, я имею в виду litb :-P) знает, каковы на самом деле требования к стандартным типам контейнеров?

com / kb / q169960 / )

Также вы можете посмотреть в Google, как получить информацию о трассировке тупиковых ситуаций (флаг трассировки 1222) - это даст отчет о том, какие операторы SQL конфликтуют из-за каких объектов каждый раз возникает тупик. Это довольно приличная статья - http://blogs.msdn.com/bartd/archive/2006/09/09/747119.aspx

13
ответ дан 5 December 2019 в 13:01
поделиться

Чтения все еще могут вызывать блокировки, чтобы БД гарантировала, что запись не будет сделана в середине неатмического чтения. Другими словами, блокировка чтения гарантирует, что вы получите точный согласованный снимок любых данных, которые вы выбираете.

0
ответ дан 5 December 2019 в 13:01
поделиться

У вас такое же поведение с adOpenForwardOnly ?

Возможно, вы захотите проверить актуальность статистики вашего SQL Server. Или вы можете попросить администратора базы данных перестроить все индексы. Многие проблемы с блокировкой возникают из-за устаревшей статистики / индексов.

0
ответ дан 5 December 2019 в 13:01
поделиться

Это зависит от поведения обоих приложений. ваше приложение наверняка может дождаться освобождения ресурсов другим.

-1
ответ дан 5 December 2019 в 13:01
поделиться

Тупик - это состояние, при котором два или более процесса ждут друг друга, чтобы освободить ресурс, или более двух процессов ожидают ресурсов в кольцевой цепочке. Конечно, вы можете создать тупик с доступом только для чтения, потому что чтение НЕ будет ждать.

В википедии есть хорошее объяснение условий тупика.

-1
ответ дан 5 December 2019 в 13:01
поделиться

Разве это не будет примерно так?

Другое приложение : запись в таблицу (получение блокировки записи в таблице)

Ваше приложение : чтение из таблицы (получить блокировку чтения таблицы, невозможно из-за блокировки записи).

-2
ответ дан 5 December 2019 в 13:01
поделиться

Я думаю, что в уже предоставленных здесь ответах есть несколько возможностей. Поскольку вы принимаете только разделяемые блокировки, взаимоблокировка не может быть связана с эскалацией блокировок, а должна просто иметь блокировки, несовместимые с блокировками, полученными в другом процессе, и получение этих блокировок в другом порядке ...

Ваши общие блокировки блокировки несовместимы с другим процессом, принимающим монопольные блокировки. Сценарий может выглядеть примерно так ...

  1. Вы принимаете совместную блокировку ресурса A
  2. Другой процесс принимает монопольную блокировку ресурса B
  3. Другой процесс пытается получить монопольную блокировку ресурса A и блокирует, ожидая, пока вы снимете общую блокировку с ресурса A.
  4. Вы пытаетесь взять разделяемую блокировку на ресурс B и будете блокировать ожидание, пока другой процесс освободит свою исключительную блокировку на B, за исключением того, что вы сейчас находитесь в ситуации взаимоблокировки, которая определяется сервером, и он выбирает процесс для kill.

NB. В тупиковых ситуациях может участвовать больше игроков, чем просто 2. Иногда возникает целая цепочка взаимосвязанных действий, которая приводит к тупику, но принцип тот же.

Часто, если несколько приложений обращаются к одной и той же базе данных, там - администратор баз данных, который управляет всем доступом через хранимые процедуры, поэтому он может гарантировать, что ресурсы всегда заблокированы в одном и том же порядке. Если ты' re не в такой ситуации, и другие приложения используют специальные операторы SQL, вам нужно будет проверить их код, чтобы выяснить, могут ли они конфликтовать с вашим приложением, как я описал. Звучит не очень весело.

Прагматическим решением может быть обнаружение ошибки, когда ваша транзакция прекращается как жертва тупиковой ситуации, и просто повторная попытка транзакции несколько раз. В зависимости от того, какую активность генерируют другие приложения, таким образом можно добиться приемлемых результатов.

и просто повторите попытку транзакции несколько раз. В зависимости от того, какую активность генерируют другие приложения, таким образом можно добиться приемлемых результатов.

и просто повторите попытку транзакции несколько раз. В зависимости от того, какую активность генерируют другие приложения, таким образом можно добиться приемлемых результатов.

3
ответ дан 5 December 2019 в 13:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: