Главным образом: Visual Studio, SQL Server и некоторые расширения для них, такие как Rock-Scroll и т.д.
Являющийся веб-разработчиком я устанавливаю 4 других браузера (вдоль IE): Opera, Firefox, Chrome и Safari.
Также:
С таким количеством объектов, большинство их критических разделов будут разблокированы, и разногласий почти не будет. Как вы уже знаете (другой комментарий), критические секции не требуют перехода в режим ядра, если они не принадлежат. Это делает критические секции эффективными в данной ситуации.
Единственное, что нужно учитывать, это то, хотите ли вы, чтобы критические секции были внутри ваших объектов или в другом массиве. Местоположение ссылки - хороший повод разместить критические разделы внутри объекта. Когда вы вошли в критическую секцию, вся строка кэша (например, 16 или 32 байта) будет в памяти. С помощью небольшого отступа вы можете убедиться, что каждый объект запускается в строке кэша. В результате объект будет (частично) в кэше после входа в его критическую секцию.
критические секции не требуют перехода в режим ядра, если они не принадлежат. Это делает критические секции эффективными в данной ситуации.Единственное, что нужно учитывать, это то, хотите ли вы, чтобы критические секции были внутри ваших объектов или в другом массиве. Местоположение ссылки - хороший повод разместить критические разделы внутри объекта. Когда вы вошли в критическую секцию, вся строка кэша (например, 16 или 32 байта) будет в памяти. С помощью небольшого отступа вы можете убедиться, что каждый объект запускается в строке кэша. В результате объект будет (частично) в кэше после входа в его критическую секцию.
критические секции не требуют перехода в режим ядра, если они не принадлежат. Это делает критические секции эффективными в данной ситуации.Единственное, что нужно учитывать, будет заключаться в том, хотите ли вы, чтобы критические секции были внутри ваших объектов или в другом массиве. Местоположение ссылки - хороший повод разместить критические разделы внутри объекта. Когда вы вошли в критическую секцию, вся строка кэша (например, 16 или 32 байта) будет в памяти. С помощью небольшого отступа вы можете убедиться, что каждый объект запускается в строке кэша. В результате объект будет (частично) в кэше после входа в его критическую секцию.
Единственное, что нужно учитывать, это то, хотите ли вы, чтобы критические секции были внутри ваших объектов или в другом массиве. Местоположение ссылки - хороший повод разместить критические разделы внутри объекта. Когда вы вошли в критическую секцию, вся строка кэша (например, 16 или 32 байта) будет в памяти. С помощью небольшого отступа вы можете убедиться, что каждый объект запускается в строке кэша. В результате объект будет (частично) в кэше после входа в его критическую секцию.
Единственное, что нужно учитывать, это то, хотите ли вы, чтобы критические секции были внутри ваших объектов или в другом массиве. Местоположение ссылки - хороший повод разместить критические разделы внутри объекта. Когда вы вошли в критическую секцию, вся строка кэша (например, 16 или 32 байта) будет в памяти. С помощью небольшого отступа вы можете убедиться, что каждый объект запускается в строке кэша. В результате объект будет (частично) в кэше после входа в его критическую секцию.
Вы также можете рассмотреть MUTEX. Это хороший метод. Каждый клиент может зарезервировать ресурс самостоятельно с помощью мьютекса (взаимного исключения).
Это более распространено, некоторые библиотеки также поддерживают это с помощью потоков. Прочтите о boost :: thread и его мьютексах
С вашим подходом:
data_type data[100000];
Я бы побоялся переполнения стека, если вы не размещаете его в куче.
РЕДАКТИРОВАТЬ:
Boost :: MUTEX использует win32 Critical Sections
Ваш план стоит попробовать, но я думаю, вы обнаружите, что Windows недовольна созданием такого количества критических разделов. Каждая CS содержит некоторый дескриптор (-ы) ядра, и вы используете драгоценное пространство ядра. Я думаю, что в зависимости от вашей версии Windows у вас не хватит памяти для дескрипторов, и InitializeCriticalSection () или какая-то другая функция начнет давать сбои.
Что вы, возможно, захотите сделать, так это иметь доступный для использования пул CS, и сохраните указатель на «используемый» CS внутри своей структуры. Но тогда это довольно быстро становится сложным, и вам нужно будет использовать атомарные операции для установки / очистки указателя CS (для атомарно пометьте запись массива как «используется»). Может также потребоваться подсчет ссылок и т. Д.
Сложно.
Так что сначала попробуйте свой путь и посмотрите, что произойдет. Однажды у нас была похожая ситуация,
Первое, что я проверю при загрузке, - это установка имени параметра для того, какой file_column (или что бы то ни было, лично я бы использовал скрепку) ожидает.
Если у вас есть что-то вроде:
class Entry < ActiveRecord::Base
file_column :image
end
Вам необходимо убедиться, что параметр (имя поля формы) соответствует ожидаемому. В приведенном выше примере это будет:
name="entry[image]"
Кроме того, убедитесь, что вы пишете многостраничную форму, а не только стандартную.
убедитесь, что вы пишете многостраничную форму, а не просто стандартную. убедитесь, что вы пишете многостраничную форму, а не просто стандартную.Если вам необходимо использовать объект синхронизации, я рекомендую вам рассмотреть возможность разделения набора данных на подмножества и использования одного объекта синхронизации для каждого подмножества. Например, вы можете рассмотреть возможность использования одного CRITICAL_SECTION для каждого диапазона из 1000 элементов в массиве данных.
Как отмечали другие, да, есть проблема, и это называется слишком мелкозернистой блокировкой ... это расточительное использование ресурсов, и даже если шансы невелики, вы начнете создавать множество базовых примитивов и данных, когда что-то действительно станет случайным, назовем это дольше, чем обычно, или как-то иначе. Кроме того, вы зря тратите ресурсы, поскольку это не совсем тривиальная структура данных, как, например, в VM.
Если я правильно помню, с этого момента у вас будет больше шансов на исключение SEH в Win32 или просто на большее использование памяти. Разделение и объединение их в пул, вероятно, будет подходящим вариантом, но это более сложная реализация. Разделение на что-то еще (re: action) и ожидание некоторой кратковременной конкуренции - еще один способ справиться с этим.
В любом случае, это проблема управления ресурсами с тем, что у вас есть прямо сейчас.