2015-09-10 2 views
2

Есть ли способ синхронизировать доступ к каждому элементу в выделенной памяти. Например, если выделить память, используя следующий кодСинхронизация доступа к выделенной памяти

int* counters = new int[10]; 

есть способ для синхронизации модификации каждого счетчика отдельно (будучи в состоянии изменить счетчики [0], счетчики [1] ... счетчики [9] в то же время), так что модификация, скажем, счетчиков [0] не будет блокировать счетчики [9] до тех пор, пока блокировка не будет выпущена для обновления счетчиков [9] и других счетчиков, пока поток обновляет конкретный счетчик, счетчики [0]? Счетчики не связаны и не зависят от каких-либо общих данных с другими счетчиками?

+2

Используйте массив мьютексов. Индекс в массиве mutex соответствует индексу в массиве счетчиков. – Barmar

+0

Я думал об этом, но пейджинг выделенной памяти на диск приводит к повреждению данных. Также существует стандартный способ, отличный от массива мьютексов, чтобы справиться с этой ситуацией? – WhatIf

+0

Если пейджинг имеет какое-либо видимое влияние на программу, отличную от производительности, это будет невероятно серьезная ошибка ОС. – Barmar

ответ

-1

Хотя массив мьютексов является естественным решением, следует учитывать последствия. Это прекрасно с массивами из 10 элементов, но количество мьютексов фактически ограничено. Если у вас есть массивы, скажем, 50 000 предметов (не так уж и больших), у вас не будет мьютексов.

+0

Соответствует: http://stackoverflow.com/a/3715001/425871 – Steve

+0

Какое максимальное количество мьютексов разрешено? – WhatIf

+0

@ user1886067 честно - не знаю даже на моей системе, а тем более на вашем. – SergeyA

2

Вам необходимо изучить заголовочные объекты <atomic>, если вы хотите избежать использования мьютексов для синхронизации.

Предполагая, что ваш массив «счетчиков» - это просто способ отслеживать определенное количество отсчетов, это можно сделать, используя std::atomic<int> counters[10], и каждый счетчик может быть увеличен потоком безопасным способом, вызвав counters[i].fetch_add(1, std::memory_order_relaxed).

Как указал пользователь Barmar, std::atomic<int> также может использовать мьютексы внутри. Это зависит от реализации и может быть запрошено путем вызова функции-члена is_lock_free() экземпляра std::atomic<int>. По моей реализации, std::atomic<int> экземпляры блокировки бесплатно.

+0

Разве это вряд ли будет использовать мьютексы под обложками? Таким образом, это может привести к одному и тому же пределу количества мьютексов? – Barmar

+0

Вы правы. Я отредактировал свой ответ, чтобы сделать это ясно. –

+0

@ Barmar, в то время как это возможно, это, безусловно, НЕ ПОЛНОСТЬЮ. – SergeyA

Смежные вопросы