Vim errorformat для Visual Studio

Я не могу понять причину, по которой мы должны «никогда не синхронизироваться в Boolean»

Вам нужно synchronize на экземпляр объекта константы . Если вы синхронизированы на любом объекте, который вы назначаете (т. Е. Меняете объект), то объект не является постоянным, а разные потоки будут синхронизироваться на разных объектах экземплярах . Поскольку они синхронизируются в разных объектных экземплярах, в этот же момент одновременно будут входить защищенные блоки, и условия гонки будут происходить. Это тот же самый ответ для синхронизации на Long, Integer и т. Д.

Boolean isOn;
...
synchronized (isOn) {
   if (isOn) {
      // this changes the synchronized object isOn to another object
      // so another thread can then enter the synchronized with this thread
      isOn = false;

Чтобы усугубить ситуацию (как отметил в своем ответе @McDowell) любой Boolean, который создается через autoboxing (isOn = true) - это тот же объект, что и Boolean.TRUE (или .FALSE), который является одиночным элементом в ClassLoader через всех объектов . Ваш объект блокировки должен быть локальным для класса, в котором он используется, иначе вы будете блокировать один и тот же одноэлементный объект, который другие классы могут блокировать в других случаях блокировки, если они совершают ту же ошибку.

правильный шаблон, если вам нужно заблокировать логическое значение, это определить объект блокировки private final:

private final Object lock = new Object();
...

synchronized (lock) {
   ...

Или вы также должны рассмотреть возможность использования объекта AtomicBoolean, что означает, что вам может не потребоваться synchronize на нем вообще.

private final AtomicBoolean isOn = new AtomicBoolean(false);
...

// if it is set to false then set it to true, no synchronization needed
if (isOn.compareAndSet(false, true)) {
    statusMessage = "I'm now on";
} else {
    // it was already on
    statusMessage = "I'm already on";
}

В вашем случае, поскольку вам кажется, что вам нужно переключать его вкл / выкл с помощью потоков, вам все равно нужно synchronize на объекте lock и задайте логическое значение и избегайте условия проверки / установки гонки:

synchronized (lock) {
    if (isOn) {
        isOn = false;
        statusMessage = "I'm off";
        // Do everything else to turn the thing off
    } else {
        isOn = true;
        statusMessage = "I'm on";
        // Do everything else to turn the thing on
    }
}

Наконец, если вы ожидаете, что statusMessage будет доступен из других потоков, тогда он должен быть отмечен как volatile, если вы не будете synchronize во время получения.

31
задан Kevin Berridge 23 September 2008 в 20:47
поделиться

5 ответов

Копия с вопроса удалить из 'оставшегося без ответа' списка

set errorformat=\ %#%f(%l\\\,%c):\ %m

Это получит вывод и для devenv /Build и для msbuild. Однако msbuild имеет одну выгоду. По умолчанию это производится, не включает полные пути. Для фиксации этого, необходимо добавить следующую строку к основному PropertyGroup csproj файла:

<GenerateFullPaths>True</GenerateFullPaths>
8
ответ дан 27 November 2019 в 22:41
поделиться

Попытайтесь выполнить msbuild вместо devenv. Это откроет тонну питания в том, как сборка работает.

Открывают Visual Studio Command Prompt для подъема набора пути. Затем сделайте msbuild MySln.sln /Configuration:Debug.

См. msbuild /? для справки.

1
ответ дан 27 November 2019 в 22:41
поделиться

Я нашел этот вопрос, когда искал формат ошибки для компиляции c++ в Visual Studio. Приведенные выше ответы не работают для меня (я также не использую MSBuild).

Я понял это из этого совета по Vim и :help errorformat:

" filename(line) : error|warning|fatal error C0000: message
set errorformat=\ %#%f(%l)\ :\ %#%t%[A-z]%#\ %[A-Z\ ]%#%n:\ %m

Что даст вам быстрое исправление, выглядящее так:

stats.cpp|604 error 2039| 'getMedian' : is not a member of 'Stats'

(с выделенной ошибкой) от

c:\p4\main\stats.cpp(604) : error C2039: 'getMedian' : is not a member of 'Stats'
1
ответ дан 27 November 2019 в 22:41
поделиться

Я нашел еще лучший ответ: используйте : compiler , чтобы использовать встроенные настройки efm .

" Microsoft C#
compiler cs
" Microsoft Visual C++
compiler msvc
" mono
compiler mcs
" gcc
compiler gcc

Примечание: он также устанавливает makeprg по умолчанию . См. $ VIMRUNTIME / compiler /

4
ответ дан 27 November 2019 в 22:41
поделиться

Ни один из этих форматов ошибок не работал в профессиональной версии Visual Studio 2009 v9.0.21022.8. Используя cygwin, приходилось вызывать devenv из bash, что немного усложняло установку makeprg (пакетные файлы винта). Также мне пришлось настроить мой формат ошибок, когда devenv разделяется на несколько процессов и обрабатывает сообщение об ошибке с «1>» или «2>» и т. Д .:

set autowrite
"2>c:\cygwin\home\user\proj/blah.cpp(1657) : error C2065: 'blah' : undeclared identifier

set errorformat=%.%#>\ %#%f(%l)\ :\ %#%t%[A-z]%#\ %[A-Z\ ]%#%n:\ %m
let prg="devenv"
let makepath=$MAKEPATH
let &makeprg='cmd /c "'.prg.' '.makepath.'"'

Мой .bashrc устанавливает переменную среды MAKEPATH с помощью cygpath для преобразования в путь, совместимый с DOS:

export MAKEPATH="$(cygpath -d "proj/VC9/some.sln") /build \"Debug\""

Если у вас vim 6.x, вы можете использовать : cw , что НАМНОГО лучше, чем clist (попробуйте поискать ошибки среди сотен предупреждений, и вы понимаете, о чем я). Глядя на твики vim, меня тошнит, но я в раю vim !!! Прощай, визуальная студия! Спасибо за базу для настройки pydave +1.

0
ответ дан 27 November 2019 в 22:41
поделиться
Другие вопросы по тегам:

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