Отмеченные поля C# ThreadStaticAttribute автоматически выпущены, когда поток умирает?

Я обнаружил 'ThreadStaticAttribute', и у меня есть много вопросов об этом: весь мой зависимый предыдущего сообщения статическая информация, были реализованы как статический словарь, какой TKey является Потоком, и когда я хотел получить доступ к нему, я использовал Поток. CurrentThread и это работают. Но это требует mantainance, потому что, если поток умирает, я должен удалить соответствующую запись из словаря. И я также должен рассмотреть потокобезопасность и много других вопросов.

При помощи ThreadStaticAttribute все эти вопросы, кажется, решены, но я должен быть уверен в нем. Мои вопросы: я должен удалить экземпляр, содержат отмеченными полями 'ThreadStaticAttribute', так или иначе, прежде чем поток умрет?? Где информация того поля, содержат?? Это находится в экземпляре объекта Потока или чего-то как этот, так, чтобы, когда это больше не используется, сборщик "мусора" автоматически отбросил его? Есть ли потери производительности? Какие? Это быстрее, чем использование Включенного набора как, я делал?

Мне нужно разъяснение по поводу того, как работают 'ThreadStaticAttribute'.

Спасибо.

18
задан quirimmo 30 May 2017 в 05:42
поделиться

2 ответа

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

Единственным исключением здесь является, если ценное значение IDSPosable , и вы хотите активно распоряжаться этим. В целом это сложная проблема для решения по ряду причин. Это намного проще, чтобы не иметь ценностей, которые реализуются IDSposable и находятся в в поле .

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

  1. . Поле ссылается на разное значение для доступа к потоке.
  2. Инициализатор для поля будет запущен только один раз (на практике, это плохое представление о том, чтобы иметь любую).
12
ответ дан 30 November 2019 в 09:06
поделиться

Простое описание SDK показывает, что ответ заключается в том, что это не имеет значения - они одинаковы . Оба они превращаются в __ T (x) .

C:\...\Visual Studio 8\VC>findstr /spin /c:"#define _T(" *.h 
crt\src\tchar.h:2439:#define _T(x)       __T(x) 
include\tchar.h:2390:#define _T(x)       __T(x)

C:\...\Visual Studio 8\VC>findstr /spin /c:"#define _TEXT(" *.h 
crt\src\tchar.h:2440:#define _TEXT(x)    __T(x) 
include\tchar.h:2391:#define _TEXT(x)    __T(x)

И для полноты:

C:\...\Visual Studio 8\VC>findstr /spin /c:"#define __T(" *.h 
crt\src\tchar.h:210:#define __T(x)     L ## x 
crt\src\tchar.h:889:#define __T(x)      x 
include\tchar.h:210:#define __T(x)     L ## x 
include\tchar.h:858:#define __T(x)      x

Однако, технически , для C++ следует использовать TEXT () вместо _ TEXT () , но он (в конечном итоге) расширяется и на то же самое.

-121--1404155-

Неправильный синтаксис JSON. Нельзя иметь один и тот же ключ дважды в объекте. Вместо этого вам нужен массив:

var homes = {
  "Agents" : [
    { "name" : "Bob Barker" },
    { "name" : "Mona Mayflower" }
  ],
  ...
}

Тогда вы можете получить доступ к агентам так:

homes.Agents[1] // => { "name": "Mona Mayflower" }

// or

homes.Agents[1].name // => "Mona Mayflower"
-121--3796805-

Пометка статической переменной-члена как [ThreadStatic] говорит компилятору выделить ее в области памяти потока (например, где выделен стек потока), а не в глобальной области памяти. Таким образом, каждый поток будет иметь собственную копию (которая гарантированно будет инициализирована до значения по умолчанию для этого типа, например. null, 0, false и т.д.; не используйте внутристрочные инициализаторы, поскольку они инициализируют его только для одного потока).

Таким образом, когда поток уходит, его область памяти также освобождает ссылку. Конечно, если это то, что нуждается в более немедленном удалении (открытые потоки файлов и т.д.) вместо ожидания фоновой сборки мусора, вы можете убедиться, что вы сделаете это до выхода потока.

Объем доступного пространства [ThreadStatic] может быть ограничен, но этого должно быть достаточно для разумного использования. Он должен быть несколько быстрее, чем доступ к коллекции с ключом (и более легко защищен от потоков), и я думаю, что он сравним с доступом к обычной статической переменной.

Исправление: С тех пор я слышал, что доступ к переменным ThreadStatic несколько медленнее, чем к обычным статическим переменным. Я не уверен, что это даже на самом деле быстрее, чем доступ к шпоночной коллекции, но это позволяет избежать проблем сирот (что было вашим вопросом) и необходимости блокировки для безопасности резьбы, что усложнит подход к шпоночной коллекции.

6
ответ дан 30 November 2019 в 09:06
поделиться
Другие вопросы по тегам:

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