Методы SetValue/GetValue Системы. Ориентированный на многопотоковое исполнение массив?

Кажется, что самый надежный способ запуститься с даты UTC состоит в том, чтобы создать новое Date объект и использовать эти setUTC… методы для установки его на дату/время, которую Вы хотите.

Тогда различное toLocale…String методы обеспечат локализованный вывод.

Пример:

// This would come from the server.
// Also, this whole block could probably be made into an mktime function.
// All very bare here for quick grasping.
d = new Date();
d.setUTCFullYear(2004);
d.setUTCMonth(1);
d.setUTCDate(29);
d.setUTCHours(2);
d.setUTCMinutes(45);
d.setUTCSeconds(26);

console.log(d);                        // -> Sat Feb 28 2004 23:45:26 GMT-0300 (BRT)
console.log(d.toLocaleString());       // -> Sat Feb 28 23:45:26 2004
console.log(d.toLocaleDateString());   // -> 02/28/2004
console.log(d.toLocaleTimeString());   // -> 23:45:26

Некоторые ссылки:

5
задан Community 23 May 2017 в 12:16
поделиться

3 ответа

MSDN: Класс массива

Открытый статический (общий в Visual Basic) члены этого типа потокобезопасны. Члены экземпляра не являются гарантированно поточно-ориентированная.

Эта реализация не обеспечивает синхронизированная (потокобезопасная) оболочка для массив; однако .NET Framework классы на основе Array предоставляют свои собственная синхронизированная версия сбор с помощью SyncRoot свойство.

Это не потокобезопасно!

Изменить:

Некоторая дополнительная информация, метод SetValue в классе Array не вызывается в обычных обстоятельствах, он вызывается только тогда, когда массив используется через интерфейс IList.

следующий код:

int[] arr = ...
arr[i] = value;

Не будет генерировать вызов SetValue (), вместо этого будет сгенерирован код операции OpCodes.Stelem.

Поэтому не имеет значения, является ли метод SetValue потокобезопасным или нет, если только к массиву не обращаются с использованием ссылки IList.

3
ответ дан 15 December 2019 в 06:28
поделиться

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

Однако вы не можете поделиться 1 банкой пива с тремя людьми, ни при программировании, ни в реальной жизни.

так что да:

если каждый поток работает только с отдельной частью массива, все будут be well

PS: У меня нет источника, чтобы проверить это, но я использую потоки все время, и у меня никогда не было проблемы с голоданием (?), когда каждый поток одновременно читает n записей в массиве. У меня ДЕЙСТВИТЕЛЬНО возникают проблемы, когда я делюсь «одной и той же банкой пива», поэтому я считаю, что мой ответ правильный, но я бы хотел, чтобы кто-нибудь это подтвердил.

0
ответ дан 15 December 2019 в 06:28
поделиться

В вашем примере вызовы InternalSetValue (void *, object) делаются в трех разных ячейках памяти. Следовательно, он должен быть потокобезопасным. Записи в эти места не перетекают в другие места, даже если они являются членами того же массива.

0
ответ дан 15 December 2019 в 06:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: