Взаимно блокируемый и энергозависимый

Необходимо ли на самом деле сослаться на классы во время определения класса? т.е.

 class CRoom(object):
     person = CPerson("a person")

Или (более вероятно), сделайте Вас, просто должен использовать CPerson в методах Вашего класса (и наоборот). например:

class CRoom(object):
    def getPerson(self): return CPerson("someone")

, Если второе, нет никакой проблемы - как, к тому времени, когда метод становится названным , а не определенный, модуль будет импортирован. Ваша единственная проблема состоит в том, как обратиться к ней. Вероятно, Вы делаете что-то как:

from CRoom import CPerson # or even import *

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

#croom.py
import cperson
class CRoom(object):
    def getPerson(self): return cperson.CPerson("someone")

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

70
задан Stormenet 1 March 2011 в 09:29
поделиться

2 ответа

Вы можете игнорировать это предупреждение, когда используете Interlocked.Xxx (см. этот вопрос ), потому что они всегда выполняют временные операции. Итак, переменная volatile идеально подходит для общего состояния. Если вы хотите любой ценой избавиться от предупреждения, вы действительно можете выполнить блокированное чтение с помощью Interlocked.CompareExchange (ref counter, 0, 0) .

Edit: На самом деле, вам понадобится volatile в вашей переменной состояния , только , если вы собираетесь писать в нее напрямую (то есть без использования Interlocked.Xxx ). Как упоминал jerryjvl ,

42
ответ дан 24 November 2019 в 13:30
поделиться

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

Чрезмерное упрощение и перефразирование:
volatile означает, что каждая операция чтения должна быть перечитана из память, потому что могут быть другие потоки, обновляющие переменную. При применении к полю, которое может быть прочитано / записано атомарно архитектурой, в которой вы работаете, это должно быть все, что вам нужно сделать, если вы не используете long / ulong, большинство других типов можно читать / записывать атомарно.

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

Какой из этих двух подходов работает лучше всего, зависит от того, что именно вы делаете. И это объяснение является большим упрощением. Но из этого должно быть ясно, что делать и то и другое одновременно бессмысленно.

41
ответ дан 24 November 2019 в 13:30
поделиться
Другие вопросы по тегам:

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