none
Interlocked.Increment и указатели RRS feed

  • Вопрос

  • Являются ли операции с указателями потоко безопасными? Тот же инкремент например. И на сколько корректна такая запись Interlocked.Increment(ref bodyPtr[0]); где bodyPtr это int*. Компилятор ничего не сказал.
    8 марта 2011 г. 2:44

Ответы

  • Ну вот например есть указатель ptr, который указывате на какую-то область в памяти, например элемент массива. Есть функция inc() { ++ptr }, которая увеличивает указатель, чтобы он указывал на следующий элемент. ++ptr эквивалентно ptr = ptr + размер указателя, т.е. берется значени, увеличивается и присваивается. Если 2 потока одновременно вызовут функцию inc(), то может получится так, что оба они возьмут и увеличат старое значение указателя и в итоге получится +1 вместо +2.


    Для связи [mail]
    • Помечено в качестве ответа Max Charp 29 марта 2011 г. 12:20
    14 марта 2011 г. 15:16

Все ответы

  • Использование класса Interlocked - это потокобезопасный способ изменить значение переменной, т.к. изменение значения и присваиваение происходит за одну операцию, т.е. атомарно.


    Для связи [mail]
    • Предложено в качестве ответа Abolmasov Dmitry 24 марта 2011 г. 8:54
    • Помечено в качестве ответа I.Vorontsov 29 марта 2011 г. 8:12
    • Снята пометка об ответе Max Charp 29 марта 2011 г. 12:19
    12 марта 2011 г. 19:37
  • Это я и сам знаю, но тут не обычная переменная а ссылка на значение указателя. :). И вопрос еще в том нужны ли такие махинации если я просто использую указатель. По мойму процессор в таких случаях загружает в кеш только адрес значения, а не само значение.
    12 марта 2011 г. 20:45
  • Ну вот например есть указатель ptr, который указывате на какую-то область в памяти, например элемент массива. Есть функция inc() { ++ptr }, которая увеличивает указатель, чтобы он указывал на следующий элемент. ++ptr эквивалентно ptr = ptr + размер указателя, т.е. берется значени, увеличивается и присваивается. Если 2 потока одновременно вызовут функцию inc(), то может получится так, что оба они возьмут и увеличат старое значение указателя и в итоге получится +1 вместо +2.


    Для связи [mail]
    • Помечено в качестве ответа Max Charp 29 марта 2011 г. 12:20
    14 марта 2011 г. 15:16