Как различить потоки, запущенные из ThreadPool?
От: Zeiss  
Дата: 27.01.06 15:11
Оценка:
Приложение выполняет короткие задачи в потоках ThreadPool'а.
Как организовать TLS * для этих потоков?

Проблема: ThreadPool повторно использует (recycles) потоки, т.е. запускает для новых задач потоки, которые, возможно, ранее уже выполняли аналогичную работу. Таким образом, получить уникальный ключ для потока нельзя, и стандартный код типа
TLS tls = (TLS) hashtable[Thread.CurrentThread];
if (tls == null) { /* это новый поток, создаем для него свой TLS */  }
работает неправильно, если текущий поток уже был использован.

Таким образом, необходимо не только дифференцировать потоки в отдельно взятый момент времени, но и на протяжении работы процесса.

Свойство System.Thread.Name не годится, т.к. оно set-once.
Использование LocalDataStoreSlot тоже не подходит, т.к. слоты при перезапуске потоков из ThreadPool'а не сбрасываются.
Thread.GetHashCode(), AppDomain.GetCurrentThreadId() и одноименная функция из Kernel32.dll также возвращают повторяющиеся значения.

* Thread Local Storage. Необходимо ассоциировать с текущим потоком значение, не повторяющееся между потоками.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.