Мне было интересно, есть ли поддержка в новых моделях шейдеров для считывания значения пикселя из целевого буфера кадра. Я предполагаю, что это уже делается на более поздних (непрограммируемых) этапах конвейера рисования, что заставило меня надеяться, что эта функция могла быть добавлена в программируемый конвейер.
Я знаю, что можно рисовать в текстуру связанного кадрового буфера, а затем отправить эту текстуру шейдеру, я просто надеялся на более элегантный способ достижения той же функциональности. защищенный длинный m_RunningCounter защищенный объект m_Lock = новый объект (); public long ...
У меня есть код, который должен быть потокобезопасным, поведение которого похоже на это:
protected long m_RunningValue
protected long m_RunningCounter
protected object m_Lock = new object();
public long RunningValue { get { return Interlocked.Read(m_RunningValue); } }
public long RunningCounter { get { return Interlocked.Read(m_RunningCounter); } }
public void DoCalculation(int newValue, int newQuantity)
{
lock(m_Lock)
{
Interlocked.Add(ref m_RunningValueA, newValue);
Interlocked.Add(ref m_RunningCounter, newQuantity);
if(Interlocked.Read(ref newQuantity) == 0)
{
...m_RunningValue gets further modified here
}
}
}
Вычисление должно блокировать и значение, и счетчик, иначе условие гонки может повлиять на блок if (...), однако их вообще не нужно синхронизировать при считывании, то есть, если счетчик и значение изменяются между попытками чтения обоих, это на 100% нормально для меня.
Блокировка чтения предназначена для чтения с безопасностью потоков 64-битного значения.
Безопасно ли такое смешивание блокировок и блокировок? Я читал на других веб-страницах, что их смешивание небезопасно, однако я не могу найти пояснений, означает ли это, что их смешивание - отличный способ внести небольшие ошибки, или если на системном уровне это может повредить задействованные структуры данных.
Стоимость всей этой блокировки (64-битная .NET 4. 0) полностью исключают цель сохранения блокировки ReaderWriterSlim вокруг методов свойства get ()?