IanG on Tap

Ian Griffiths in Weblog Form (RSS 2.0)

Blog Navigation

April (2018)

(1 item)

August (2014)

(1 item)

July (2014)

(5 items)

April (2014)

(1 item)

March (2014)

(1 item)

January (2014)

(2 items)

November (2013)

(2 items)

July (2013)

(4 items)

April (2013)

(1 item)

February (2013)

(6 items)

September (2011)

(2 items)

November (2010)

(4 items)

September (2010)

(1 item)

August (2010)

(4 items)

July (2010)

(2 items)

September (2009)

(1 item)

June (2009)

(1 item)

April (2009)

(1 item)

November (2008)

(1 item)

October (2008)

(1 item)

September (2008)

(1 item)

July (2008)

(1 item)

June (2008)

(1 item)

May (2008)

(2 items)

April (2008)

(2 items)

March (2008)

(5 items)

January (2008)

(3 items)

December (2007)

(1 item)

November (2007)

(1 item)

October (2007)

(1 item)

September (2007)

(3 items)

August (2007)

(1 item)

July (2007)

(1 item)

June (2007)

(2 items)

May (2007)

(8 items)

April (2007)

(2 items)

March (2007)

(7 items)

February (2007)

(2 items)

January (2007)

(2 items)

November (2006)

(1 item)

October (2006)

(2 items)

September (2006)

(1 item)

June (2006)

(2 items)

May (2006)

(4 items)

April (2006)

(1 item)

March (2006)

(5 items)

January (2006)

(1 item)

December (2005)

(3 items)

November (2005)

(2 items)

October (2005)

(2 items)

September (2005)

(8 items)

August (2005)

(7 items)

June (2005)

(3 items)

May (2005)

(7 items)

April (2005)

(6 items)

March (2005)

(1 item)

February (2005)

(2 items)

January (2005)

(5 items)

December (2004)

(5 items)

November (2004)

(7 items)

October (2004)

(3 items)

September (2004)

(7 items)

August (2004)

(16 items)

July (2004)

(10 items)

June (2004)

(27 items)

May (2004)

(15 items)

April (2004)

(15 items)

March (2004)

(13 items)

February (2004)

(16 items)

January (2004)

(15 items)

Blog Home

RSS 2.0

Writing

Programming C# 5.0

Programming WPF

Other Sites

Interact Software

Thread IDs and .NET

Monday 21 June, 2004, 09:14 PM

A few days ago, dasBlonde blogged about the use of thread IDs and Thread.GetHashCode. The Technologist replied here, and then dasBlonde posted a follow-up. I thought I'd join in.

I was about to write about how I don't really understand why dasBlonde says you can't just use GetHashCode in VB.NET, but I realise Michele is ahead of me on that one...

Meanwhile, The Technologist suggested that GetHashCode was the wrong approach. He said:

"If you're trying to get the logical thread id, GetCurrentThreadId gives you that"

No it doesn't. Or at least not in general. It gives you the physical thread ID (i.e. the underlying Win32 thread ID), which is not necessarily the same thing.

It's true that in V1.0 and V1.1 of the CLR (i.e. the versions shipping today), in any given AppDomain there is a one to one mapping between logical CLR threads and physical Win32 threads. However, this has never been guaranteed - it's just an implementation detail of these versions. In fact people from Microsoft have been suggesting that this is likely not to be the case in future versions right from the start. This quote from Brad Abrams dates back to July 2000:

"we didn't make it very easy to obtain the threadid from a managed thread... that is because in general, we don't want to encourage people to obtain the ThreadId of a thread because it limits our ability in the future to break the 1:1 correspondence between managed threads and OS threads (e.g. implementing fibers in the runtime)."

This is not just a hypothetical problem - in V2.0 of .NET, this one to one mapping will indeed cease to exist in certain scenarios. Chris Brumme talks about this in his extensive item on hosting - search for "M:N" in that, and you'll see a discussion of two issues, both of which break anything that assumes the physical thread ID tells you anything about the logical thread ID: (1) a given physical thread may carry multiple logical threads, and (2) a given logical thread may migrate from one physical thread to another over time.

So if you're looking for a dependable logical thread identifier, the Win32 thread ID is The Wrong Thing.

The thread's hash code is however guaranteed to provide a unique identifier, as it says here. (Thanks to Mark Allan for pointing this out to me, and enabling me to remove the horrible code I had in an earlier version of this entry... I'm pretty sure that at one point in history this was an undocumented feature. I failed to turf this up earlier when I wrote this blog, because strictly speaking, the Thread.GetHashCode method that this page refers to doesn't actually exist! Thread just inherits the implementation from Object, and Object.GetHashCode's documentation makes no such guarantee.)

But then as Michele points out, if all you want is an easy way to work out which thread you're looking at in the debugger, just setting the thread's Name property is usually a better bet.

Copyright © 2002-2024, Interact Software Ltd. Content by Ian Griffiths. Please direct all Web site inquiries to webmaster@interact-sw.co.uk