473,387 Members | 1,575 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,387 software developers and data experts.

Thread-safety analyzer/simple guidelines

Hi,

I've got a method that I want to execute in a multithreaded environment
(it's a specialized spider. I want to run a whole bunch of copies at low
priority as a service). It works well running as a single application.

I was wondering if there is a "Thread-Safety Analysis Wizard"?

I'm sure I'm grossly off-base with the following, so I'm prepared to be
embarrassed. Please point me in the right direction!

I would be tempted to summarize the thread-safety rules as the following:
1. Don't make unsynchronized calls to framework (and 3rd party) methods that
are known to not be thread-safe (and how do I find out which are which, I
wonder?)
2. Don't make unsynchronized changes to static fields (I'm not sure whether
unsynchronized reads would be considered safe or not).
3. Similar to #2, watch out for access to local variables in static methods.

So, am I far off? Am I missing about 100 other cases, or some big principles
here?

Thanks for your advice.

--
Warren Sirota
www.wsdesigns.com
Oct 2 '06 #1
4 2537
Warren,

AFAIK there is nothing like an analysis wizard for thread safety. FX
Cop might have some rules in it, but I don't know for sure (you can probably
google to see if there are rules for it, or custom rules that someone else
wrote that you agree with).

As for your points, the only one that is really off is #3. Local
variables are just that, local variables on the stack. They don't have
concerns about thread safety that member fields do, for example (since each
thread gets its own stack). However, you do have to be careful with what
local variables might reference. If you have a local variable that is
assigned an object reference which is shared, then you have to worry about
accessing that object, of course.

With #1 and #2, those are really just specializations of a more general
rule, that rule being that if the resource is shared among two threads, you
have to synchronize access to it.

Hope this helps.
--
- Nicholas Paldino [.NET/C# MVP]
- mv*@spam.guard.caspershouse.com

"Warren Sirota" <Wa**********@discussions.microsoft.comwrote in message
news:87**********************************@microsof t.com...
Hi,

I've got a method that I want to execute in a multithreaded environment
(it's a specialized spider. I want to run a whole bunch of copies at low
priority as a service). It works well running as a single application.

I was wondering if there is a "Thread-Safety Analysis Wizard"?

I'm sure I'm grossly off-base with the following, so I'm prepared to be
embarrassed. Please point me in the right direction!

I would be tempted to summarize the thread-safety rules as the following:
1. Don't make unsynchronized calls to framework (and 3rd party) methods
that
are known to not be thread-safe (and how do I find out which are which, I
wonder?)
2. Don't make unsynchronized changes to static fields (I'm not sure
whether
unsynchronized reads would be considered safe or not).
3. Similar to #2, watch out for access to local variables in static
methods.

So, am I far off? Am I missing about 100 other cases, or some big
principles
here?

Thanks for your advice.

--
Warren Sirota
www.wsdesigns.com

Oct 2 '06 #2
Nicholas Paldino [.NET/C# MVP] <mv*@spam.guard.caspershouse.comwrote:
AFAIK there is nothing like an analysis wizard for thread safety. FX
Cop might have some rules in it, but I don't know for sure (you can probably
google to see if there are rules for it, or custom rules that someone else
wrote that you agree with).

As for your points, the only one that is really off is #3. Local
variables are just that, local variables on the stack. They don't have
concerns about thread safety that member fields do, for example (since each
thread gets its own stack). However, you do have to be careful with what
local variables might reference. If you have a local variable that is
assigned an object reference which is shared, then you have to worry about
accessing that object, of course.
These days, I worry about even local variables. The way I read the blog
entry at
http://blogs.msdn.com/grantri/archiv...07/226355.aspx
even the following code is unsafe:
void Foo()
{
string x = someMemberVariable;

if (x != null)
{
Console.WriteLine (x.Length);
}
}

That looks like it can't throw a NullReferenceException, right?
According to the blog article, the IA-64 JIT may notice that x is only
ever an alias for someMemberVariable, and not bother with the local
variable at all. I find that intensely worrying...

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
Oct 2 '06 #3
Warren,

Warren Sirota wrote:
Hi,

I've got a method that I want to execute in a multithreaded environment
(it's a specialized spider. I want to run a whole bunch of copies at low
priority as a service). It works well running as a single application.

I was wondering if there is a "Thread-Safety Analysis Wizard"?

I'm sure I'm grossly off-base with the following, so I'm prepared to be
embarrassed. Please point me in the right direction!

I would be tempted to summarize the thread-safety rules as the following:
1. Don't make unsynchronized calls to framework (and 3rd party) methods that
are known to not be thread-safe (and how do I find out which are which, I
wonder?)
The documentation for every class in the BCL has a thread-safety
section. All classes guarentee thread-safe implementations for static
members (I say all because I haven't seen any that don't) and only a
few guarentee it for instance members. Third party libraries should
contain similar documentation.
2. Don't make unsynchronized changes to static fields (I'm not sure whether
unsynchronized reads would be considered safe or not).
That's pretty much correct. One exception is events. According to the
specification the default add and remove accessors for an event are
thread-safe. Now, I realize the accessors aren't actually fields, but
since the compiler creates default accessors it may be confusing.
Reads can be very confusing. I *think* a read of a readonly static
field or a field that was initialized in the static constructor should
be fine, but aside from that one thread could change the field and
another wouldn't see the change because of compiler or hardware
optimizations.
3. Similar to #2, watch out for access to local variables in static methods.
Nick already explained this.
So, am I far off? Am I missing about 100 other cases, or some big principles
here?
Well, the specification should spell out all of the
rules...theorectically anyway. The problem is that they may not all be
in one place so you'd have poke around and then you'd have to interpret
and apply them correctly to each case.
>
Thanks for your advice.

--
Warren Sirota
www.wsdesigns.com
Oct 2 '06 #4

Jon wrote:
These days, I worry about even local variables. The way I read the blog
entry at
http://blogs.msdn.com/grantri/archiv...07/226355.aspx
even the following code is unsafe:
void Foo()
{
string x = someMemberVariable;

if (x != null)
{
Console.WriteLine (x.Length);
}
}

That looks like it can't throw a NullReferenceException, right?
According to the blog article, the IA-64 JIT may notice that x is only
ever an alias for someMemberVariable, and not bother with the local
variable at all. I find that intensely worrying...

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
Holy incomprehensible memory model batman. That's why low-lock
techniques are insanely difficult to get right.

Oct 3 '06 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

4
by: Gilles Leblanc | last post by:
Hi I have started a small project with PyOpenGL. I am wondering what are the options for a GUI. So far I checked PyUI but it has some problems with 3d rendering outside the Windows platform. I...
7
by: Ivan | last post by:
Hi I have following problem: I'm creating two threads who are performing some tasks. When one thread finished I would like to restart her again (e.g. new job). Following example demonstrates...
4
by: Matthew Groch | last post by:
Hi all, I've got a server that handles a relatively high number of concurrent transactions (on the magnitude of 1000's per second). Client applications establish socket connections with the...
13
by: Paul | last post by:
Hi, How do I wait until a thread is finished his job then continue to the original thread? public void main(string args) { Thread t = new Thread(new ThreadStart(DoWork)); t.Start();
16
by: droopytoon | last post by:
Hi, I start a new thread (previous one was "thread timing") because I have isolated my problem. It has nothing to do with calling unmanaged C++ code (I removed it in a test application). I...
9
by: mareal | last post by:
I have noticed how the thread I created just stops running. I have added several exceptions to the thread System.Threading.SynchronizationLockException System.Threading.ThreadAbortException...
13
by: Bob Day | last post by:
Using vs2003, vb.net I start a thread, giving it a name before start. Code snippet: 'give each thread a unique name (for later identification) Trunk_Thread.Name = "Trunk_0_Thread" ' allow...
6
by: HolyShea | last post by:
All, Not sure if this is possible or not - I've created a class which performs an asynchronous operation and provides notification when the operation is complete. I'd like the notification to be...
3
by: John Nagle | last post by:
There's no way to set thread priorities within Python, is there? We have some threads that go compute-bound, and would like to reduce their priority slightly so the other operations, like...
34
by: Creativ | last post by:
Why does Thread class not support IDisposable? It's creating quite some problem. Namely, it can exhaust the resource and you have not control over it.
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.