Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 3693692
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 19, 20262026-05-19T04:24:25+00:00 2026-05-19T04:24:25+00:00

NOTE: I am really not very good at Multithreaded programming, but my current project

  • 0

NOTE: I am really not very good at Multithreaded programming, but my current project has me doing it so I am trying to get my head around what is thread safe and what is not.

I was reading one of Eric Lippert’s awesome answers on what ++i does. He says this is what really happens:

  1. x is evaluated to produce the variable
  2. the value of the variable is copied to a temporary location
  3. the temporary value is incremented to produce a new value (not overwriting the temporary!)
  4. the new value is stored in the variable
  5. the result of the operation is the new value

This got me to thinking, what if two threads where calling ++i? If the first thread is at step 3 when the second thread is on step 2. (Meaning what if the second thread copies the value off to the temp location before the first thread stores the new value in the variable?)

If that happens then it would seem that both threads would only increment i once instead of twice. (Unless the whole thing is in a lock.)

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-19T04:24:26+00:00Added an answer on May 19, 2026 at 4:24 am

    As other answers have pointed out, no, ++ is not “threadsafe”.

    Something that I think will help as you learn about multithreading and its hazards is to start being very precise about what you mean by “threadsafe”, because different people mean different things by it. Essentially the aspect of thread safety you are concerned about here is whether the operation is atomic or not. An “atomic” operation is one which is guaranteed to not be halfway complete when it is interrupted by another thread.

    (There are plenty of other threading problems that have nothing to do with atomicity but which may still fall under some people’s definitions of thread safety. For example, given two threads each mutating a variable, and two threads each reading the variable, are the two readers guaranteed to agree on the order in which the other two threads made mutations? If your logic depends on that, then you have a very difficult thread safety problem to deal with even if every read and write is atomic.)

    In C#, practically nothing is guaranteed to be atomic. Briefly:

    • reading a 32 bit integer or float
    • reading a reference
    • writing a 32 bit integer or float
    • writing a reference

    are guaranteed to be atomic (see the specification for the exact details.)

    In particular, reading and writing a 64 bit integer or float is not guaranteed to be atomic. If you say:

    C.x = 0xDEADBEEF00000000;
    

    on one thread, and

    C.x = 0x000000000BADF00D;
    

    on another thread, then it is possible to on a third thread:

    Console.WriteLine(C.x);
    

    have that write out 0xDEADBEEF0BADF00D, even though logically the variable never held that value. The C# language reserves the right to make writing to a long equivalent to writing to two ints, one after the other, and in practice some chips do implement it that way. A thread switch after the first of the writes can cause a reader to read something unexpected.

    The long and short of it is: do not share anything between two threads without locking something. Locks are only slow when they are contented; if you have a performance problem because of contended locks then fix whatever architectural flaw is leading to contended locks. If the locks are not contended and are still too slow, only then should you consider going to dangerous low-lock techniques.

    The common low-lock technique to use here is of course to call Threading.Interlocked.Increment, which does an increment of an integer in a manner guaranteed to be atomic. (Note however that it still does not make guarantees about things like what happens if two threads are each doing interlocked increments of two different variables at different times, and other threads are trying to determine which increment happened “first”. C# does not guarantee that a single consistent ordering of events is seen by all threads.)

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Not a very good title, I'll try and explain. This has worked for months,
Note that I am not asking which to choose (MVC or MVP), but rather
I think this is not really possible but worth asking anyway. Say I have
[NOTE:I am really looking for some good debugging techniques here. Perhaps some tricks or
[Meta-note:] I was browsing the question page, getting really tired of DIVS vs Tables
NOTE: XMLIgnore is NOT the answer! OK, so following on from my question on
NOTE: I am not set on using VI, it is just the first thing
(Note: This is for MySQL's SQL, not SQL Server.) I have a database column
NOTE: the original question is moot but scan to the bottom for something relevant.
Though the question is very specific, I'd also really appreciate general advice and other

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.