Я работаю над проектом на C++, который использует самосозданные карты для хранения данных - карты в этом смысле будут больше похожими на «географическую» карту, поэтому изображение. Есть разные темы чтения и записи на него. Данные карты хранятся в векторе std векторов целых чисел. Его размер не изменяется, а только содержание определенных пикселей через функции getter и setter.многопоточный вектор
Моя проблема заключается в следующем: Иногда все работает нормально, но чаще я получаю поврежденные изображения в том смысле, что значение пикселя меняет знак или полностью отличается от того, что должно быть. Может ли это быть проблемой поточного доступа для чтения/записи к пикселям, если да, то что я должен использовать вместо стандартных векторов? Я попытался использовать мьютекс, чтобы гарантировать, что только один поток читает или записывает вектор, однако эти операции чтения/записи происходят так часто, что приложение становится слишком медленным, если я блокирую вектор при каждой операции.
Вы должны использовать 1D-вектор. Он работает лучше, чем 2D. – chris
Атомные операции могли бы сделать трюк, видя, как вы говорите: «размер не изменяется, а только содержание определенных пикселей через функции геттера и сеттера». Кроме того, попробуйте «разделить» доступ (т. Е. Разные потоки не изменяют одинаковые пиксели одновременно), чтобы минимизировать отравление кэша. Конечно, это не гарантирует, что два соседних пикселя согласованы друг с другом, но тогда блокировка не гарантирует этого, если вы измените их хаотичным способом. Тем не менее, он гарантирует, что, например, значение, которое увеличивается и уменьшается одновременно, не получает «странный» результат. – Damon
@Damon: Я полагаю, что модель памяти, определенная в C++ 11, предназначена для того, чтобы такие эффекты, как вы описываете со смежными пикселями, не произошли. См. [Здесь] (http://stackoverflow.com/questions/6319146/). –