Search Results

Search found 4571 results on 183 pages for 'posts'.

Page 49/183 | < Previous Page | 45 46 47 48 49 50 51 52 53 54 55 56  | Next Page >

  • C#/.NET Little Wonders: Interlocked CompareExchange()

    - by James Michael Hare
    Once again, in this series of posts I look at the parts of the .NET Framework that may seem trivial, but can help improve your code by making it easier to write and maintain. The index of all my past little wonders posts can be found here. Two posts ago, I discussed the Interlocked Add(), Increment(), and Decrement() methods (here) for adding and subtracting values in a thread-safe, lightweight manner.  Then, last post I talked about the Interlocked Read() and Exchange() methods (here) for safely and efficiently reading and setting 32 or 64 bit values (or references).  This week, we’ll round out the discussion by talking about the Interlocked CompareExchange() method and how it can be put to use to exchange a value if the current value is what you expected it to be. Dirty reads can lead to bad results Many of the uses of Interlocked that we’ve explored so far have centered around either reading, setting, or adding values.  But what happens if you want to do something more complex such as setting a value based on the previous value in some manner? Perhaps you were creating an application that reads a current balance, applies a deposit, and then saves the new modified balance, where of course you’d want that to happen atomically.  If you read the balance, then go to save the new balance and between that time the previous balance has already changed, you’ll have an issue!  Think about it, if we read the current balance as $400, and we are applying a new deposit of $50.75, but meanwhile someone else deposits $200 and sets the total to $600, but then we write a total of $450.75 we’ve lost $200! Now, certainly for int and long values we can use Interlocked.Add() to handles these cases, and it works well for that.  But what if we want to work with doubles, for example?  Let’s say we wanted to add the numbers from 0 to 99,999 in parallel.  We could do this by spawning several parallel tasks to continuously add to a total: 1: double total = 0; 2:  3: Parallel.For(0, 10000, next => 4: { 5: total += next; 6: }); Were this run on one thread using a standard for loop, we’d expect an answer of 4,999,950,000 (the sum of all numbers from 0 to 99,999).  But when we run this in parallel as written above, we’ll likely get something far off.  The result of one of my runs, for example, was 1,281,880,740.  That is way off!  If this were banking software we’d be in big trouble with our clients.  So what happened?  The += operator is not atomic, it will read in the current value, add the result, then store it back into the total.  At any point in all of this another thread could read a “dirty” current total and accidentally “skip” our add.   So, to clean this up, we could use a lock to guarantee concurrency: 1: double total = 0.0; 2: object locker = new object(); 3:  4: Parallel.For(0, count, next => 5: { 6: lock (locker) 7: { 8: total += next; 9: } 10: }); Which will give us the correct result of 4,999,950,000.  One thing to note is that locking can be heavy, especially if the operation being locked over is trivial, or the life of the lock is a high percentage of the work being performed concurrently.  In the case above, the lock consumes pretty much all of the time of each parallel task – and the task being locked on is relatively trivial. Now, let me put in a disclaimer here before we go further: For most uses, lock is more than sufficient for your needs, and is often the simplest solution!    So, if lock is sufficient for most needs, why would we ever consider another solution?  The problem with locking is that it can suspend execution of your thread while it waits for the signal that the lock is free.  Moreover, if the operation being locked over is trivial, the lock can add a very high level of overhead.  This is why things like Interlocked.Increment() perform so well, instead of locking just to perform an increment, we perform the increment with an atomic, lockless method. As with all things performance related, it’s important to profile before jumping to the conclusion that you should optimize everything in your path.  If your profiling shows that locking is causing a high level of waiting in your application, then it’s time to consider lighter alternatives such as Interlocked. CompareExchange() – Exchange existing value if equal some value So let’s look at how we could use CompareExchange() to solve our problem above.  The general syntax of CompareExchange() is: T CompareExchange<T>(ref T location, T newValue, T expectedValue) If the value in location == expectedValue, then newValue is exchanged.  Either way, the value in location (before exchange) is returned. Actually, CompareExchange() is not one method, but a family of overloaded methods that can take int, long, float, double, pointers, or references.  It cannot take other value types (that is, can’t CompareExchange() two DateTime instances directly).  Also keep in mind that the version that takes any reference type (the generic overload) only checks for reference equality, it does not call any overridden Equals(). So how does this help us?  Well, we can grab the current total, and exchange the new value if total hasn’t changed.  This would look like this: 1: // grab the snapshot 2: double current = total; 3:  4: // if the total hasn’t changed since I grabbed the snapshot, then 5: // set it to the new total 6: Interlocked.CompareExchange(ref total, current + next, current); So what the code above says is: if the amount in total (1st arg) is the same as the amount in current (3rd arg), then set total to current + next (2nd arg).  This check and exchange pair is atomic (and thus thread-safe). This works if total is the same as our snapshot in current, but the problem, is what happens if they aren’t the same?  Well, we know that in either case we will get the previous value of total (before the exchange), back as a result.  Thus, we can test this against our snapshot to see if it was the value we expected: 1: // if the value returned is != current, then our snapshot must be out of date 2: // which means we didn't (and shouldn't) apply current + next 3: if (Interlocked.CompareExchange(ref total, current + next, current) != current) 4: { 5: // ooops, total was not equal to our snapshot in current, what should we do??? 6: } So what do we do if we fail?  That’s up to you and the problem you are trying to solve.  It’s possible you would decide to abort the whole transaction, or perhaps do a lightweight spin and try again.  Let’s try that: 1: double current = total; 2:  3: // make first attempt... 4: if (Interlocked.CompareExchange(ref total, current + i, current) != current) 5: { 6: // if we fail, go into a spin wait, spin, and try again until succeed 7: var spinner = new SpinWait(); 8:  9: do 10: { 11: spinner.SpinOnce(); 12: current = total; 13: } 14: while (Interlocked.CompareExchange(ref total, current + i, current) != current); 15: } 16:  This is not trivial code, but it illustrates a possible use of CompareExchange().  What we are doing is first checking to see if we succeed on the first try, and if so great!  If not, we create a SpinWait and then repeat the process of SpinOnce(), grab a fresh snapshot, and repeat until CompareExchnage() succeeds.  You may wonder why not a simple do-while here, and the reason it’s more efficient to only create the SpinWait until we absolutely know we need one, for optimal efficiency. Though not as simple (or maintainable) as a simple lock, this will perform better in many situations.  Comparing an unlocked (and wrong) version, a version using lock, and the Interlocked of the code, we get the following average times for multiple iterations of adding the sum of 100,000 numbers: 1: Unlocked money average time: 2.1 ms 2: Locked money average time: 5.1 ms 3: Interlocked money average time: 3 ms So the Interlocked.CompareExchange(), while heavier to code, came in lighter than the lock, offering a good compromise of safety and performance when we need to reduce contention. CompareExchange() - it’s not just for adding stuff… So that was one simple use of CompareExchange() in the context of adding double values -- which meant we couldn’t have used the simpler Interlocked.Add() -- but it has other uses as well. If you think about it, this really works anytime you want to create something new based on a current value without using a full lock.  For example, you could use it to create a simple lazy instantiation implementation.  In this case, we want to set the lazy instance only if the previous value was null: 1: public static class Lazy<T> where T : class, new() 2: { 3: private static T _instance; 4:  5: public static T Instance 6: { 7: get 8: { 9: // if current is null, we need to create new instance 10: if (_instance == null) 11: { 12: // attempt create, it will only set if previous was null 13: Interlocked.CompareExchange(ref _instance, new T(), (T)null); 14: } 15:  16: return _instance; 17: } 18: } 19: } So, if _instance == null, this will create a new T() and attempt to exchange it with _instance.  If _instance is not null, then it does nothing and we discard the new T() we created. This is a way to create lazy instances of a type where we are more concerned about locking overhead than creating an accidental duplicate which is not used.  In fact, the BCL implementation of Lazy<T> offers a similar thread-safety choice for Publication thread safety, where it will not guarantee only one instance was created, but it will guarantee that all readers get the same instance.  Another possible use would be in concurrent collections.  Let’s say, for example, that you are creating your own brand new super stack that uses a linked list paradigm and is “lock free”.  We could use Interlocked.CompareExchange() to be able to do a lockless Push() which could be more efficient in multi-threaded applications where several threads are pushing and popping on the stack concurrently. Yes, there are already concurrent collections in the BCL (in .NET 4.0 as part of the TPL), but it’s a fun exercise!  So let’s assume we have a node like this: 1: public sealed class Node<T> 2: { 3: // the data for this node 4: public T Data { get; set; } 5:  6: // the link to the next instance 7: internal Node<T> Next { get; set; } 8: } Then, perhaps, our stack’s Push() operation might look something like: 1: public sealed class SuperStack<T> 2: { 3: private volatile T _head; 4:  5: public void Push(T value) 6: { 7: var newNode = new Node<int> { Data = value, Next = _head }; 8:  9: if (Interlocked.CompareExchange(ref _head, newNode, newNode.Next) != newNode.Next) 10: { 11: var spinner = new SpinWait(); 12:  13: do 14: { 15: spinner.SpinOnce(); 16: newNode.Next = _head; 17: } 18: while (Interlocked.CompareExchange(ref _head, newNode, newNode.Next) != newNode.Next); 19: } 20: } 21:  22: // ... 23: } Notice a similar paradigm here as with adding our doubles before.  What we are doing is creating the new Node with the data to push, and with a Next value being the original node referenced by _head.  This will create our stack behavior (LIFO – Last In, First Out).  Now, we have to set _head to now refer to the newNode, but we must first make sure it hasn’t changed! So we check to see if _head has the same value we saved in our snapshot as newNode.Next, and if so, we set _head to newNode.  This is all done atomically, and the result is _head’s original value, as long as the original value was what we assumed it was with newNode.Next, then we are good and we set it without a lock!  If not, we SpinWait and try again. Once again, this is much lighter than locking in highly parallelized code with lots of contention.  If I compare the method above with a similar class using lock, I get the following results for pushing 100,000 items: 1: Locked SuperStack average time: 6 ms 2: Interlocked SuperStack average time: 4.5 ms So, once again, we can get more efficient than a lock, though there is the cost of added code complexity.  Fortunately for you, most of the concurrent collection you’d ever need are already created for you in the System.Collections.Concurrent (here) namespace – for more information, see my Little Wonders – The Concurent Collections Part 1 (here), Part 2 (here), and Part 3 (here). Summary We’ve seen before how the Interlocked class can be used to safely and efficiently add, increment, decrement, read, and exchange values in a multi-threaded environment.  In addition to these, Interlocked CompareExchange() can be used to perform more complex logic without the need of a lock when lock contention is a concern. The added efficiency, though, comes at the cost of more complex code.  As such, the standard lock is often sufficient for most thread-safety needs.  But if profiling indicates you spend a lot of time waiting for locks, or if you just need a lock for something simple such as an increment, decrement, read, exchange, etc., then consider using the Interlocked class’s methods to reduce wait. Technorati Tags: C#,CSharp,.NET,Little Wonders,Interlocked,CompareExchange,threading,concurrency

    Read the article

  • What's with all the mailing archives?

    - by Yuval
    When I google for certain questions, or problems I run into I would sometimes run into 'archive' sites - these sites contain forum questions or information from other sites that are extremely poorly formatted, and are copies of the well formatted original posts from various forums. An example of one of those sites in mail-archive.com and various similar sites. Can anybody explain to me why those sites exist and how come they don't get banned from Google (since all they have is copied content that is really poorly formatted by bots)? Thanks!

    Read the article

  • Using an SSD with no AHCI [ICH7 base] - Windows 7 hangs frequently

    - by h4xnoodle
    I have a Shuttle Intel G31 + ICH7 (base -- not M/R etc) system. I just bought an OCZ Vertex 3 120gb [VTX3-25SAT3-120G] which includes the Sandforce 2218 firmware. The ICH7 does not support AHCI. I understand that this can be a problem. What I don't understand, is if it's necessary to have the proper performance of this drive. I know that without AHCI I may get a limited read/write speed -- this is fine. What my concern is, is the constant freezing/hangs I'm getting with Windows 7 on any disk activity. The 'Highest Active Time' flip-flops from 0 to 100% every minute or so regardless of large or small files. EDIT: The threads/processes with the highest response time is the kernel. I've been reading about other people with Shuttle SG31G2s, and they seem to be using SSDs no problem. Is this the controller's fault? The fact that I do not have AHCI enabled? It makes sense to me that if this SSD requires AHCI features that it would cause Windows to hang, but I would like to fully determine my situation before returning things/reformatting. To initially have my drive recognise the SSD at all, I had to change the BIOS option to Force Gen II instead of Auto for the SATA controller. I then installed Windows with no problem. There were no errors in the event log related to disk usage, but watching the perfmon I could see the highest active time and the processes (usually pagefile.sys being written to, or chrome/firefox caching) which was correlated to the hanging. So now what I need answered is: should I be returning this SSD and getting one with a different controller, or returning the SSD all-together as it will never work out and I will continue to get these hangs. Posts I've read: Windows 7 New SSD SATA AHCI? -- suggests to use AHCI http://forums.anandtech.com/showthread.php?t=2189868 -- Sandforce issues Windows 7 freezes with SSD -- and attached posts Why does my Windows 7 PC / SSD drive keep freezing? -- this is not the controller I have, but still a related issue. Windows 7 hangs after longer inactivity of user -- also tried messing with power settings with no luck. It was already set to 'Never' for turning off HDDs.

    Read the article

  • Using PhysX on a Radeon GPU?

    - by davr
    Is it possible to get PhysX to run on a Radeon GPU? I've seen various posts on forums claiming someone has found a way, but I was unable to locate any actual guides or software downloads to do it. Note: I don't mean running a GeForce and Radeon GPU in the same machine, I mean having only a Radeon GPU and having it run PhysX.

    Read the article

  • Disable mod_cache to fix website

    - by Zach Russell
    I am working on a website that runs on WordPress. The an error occurs when accessing the blog page that it displays the RSS feed (in XML) rather than the posts. After some research I found out the when enabling mod_cache this error sometimes occurs. I see when looking at the apache2 modules enabled apache2ctl -M it shows that mod_cache, mod_mem_cache and mod_disc_cache are enabled. What should I disable in order to resolve this problem?

    Read the article

  • Synergy reports connected but mouse doesn't hop between screens

    - by tor
    I'm using synergy between two windows computers (Windows 7 32-bit, acting as the server part, and Windows XP 32-bit, as a client). I'm running the server part as admin, as suggested in some posts when running synergy in Vista/7, and I think it's properly configured in the server part: It reports on both sides that the connection has succesfully been established, but there's no way to move the mouse from one screen to the other (neither from server2client, nor client2server). Any ideas?

    Read the article

  • 16GB winsxs folder on windows vista

    - by Jigs
    I know there are lots of posts about the winsxs folder, but I have yet to find any useful information about shrinking it. I have already tried running the two service pack removal tools. The folder totals a massive 16GB (about 10% of the entire drive!) If anyone has any pearls of wisdom then please share them.

    Read the article

  • Social network for internal company use

    - by khelll
    I'm seeking a social network app for employees in the company that can do the following: allows people to communicate within a company or across everyone on the social network (they can have access to a group or to everyone) post and archive interesting links, documents, etc. start a thread that goes to a group or to everyone lookup people’s info (profile) integrate w email so I can know if someone posts something new or responds to a questions Open source + customized deployment is a plus.

    Read the article

  • Looking to display a text RSS feed as Windows 7 desktop/background

    - by Matt
    I'd like to display an RSS feed (updating dynamically of course) on my Windows 7 desktop. The posts I've read about Windows 7 RSS backgrounds are all about displaying various background images delivered via RSS. What I'm looking for would be similar to the Windows XP/95 Active Desktop feature which allowed for web pages to be presented on the desktop background.

    Read the article

  • How to add authors page, authors profile and pics on Wordpress?

    - by April
    Hello, I am looking for a plugin that would add the folloiwng on our blog site built on Wordpess slef hosted: Authors' name to appear on every blog (below title where currentlly date and tags appear) Authors page being added to our blog site On authors page display authors' profile including bio, website, social network profile buttons and published posts. So it would be more like how it is set-up at Mashable: http://mashable.com/author/pete-cashmore/. Is there a plugin or plugins I could use to achieve these? Thank for help.

    Read the article

  • DNS cache-on-demand server in Win7

    - by Andrew Heath
    I live in a country that enjoys manipulating DNS entries for fun and profit. For various reasons, I cannot surf with a VPN running 100% of the time. Because some sites are only blocked via DNS spoofing, it would be very handy if I could run a local DNS server that I could update on command during active VPN sessions. Is this granularity possible on Win7? Most of the DNS server related posts on SU are regarding the more config-friendly Linux platforms...

    Read the article

  • Automater for Vista

    - by allindal
    Is a there a similar program for Vista like the MAC application Automator Specifically I'm looking for a vista app that can control timed clicks,example...in automator, I can specify which pixel and how often to click, or a series of click in different places.I'm not looking for an"intelligent clicker" just a purely GUI programed clicker. ALso i need it do work and record the keyboard. From reading other SU posts i can see that c prompt doesn't have an easy to do this.

    Read the article

  • CSS code formatting from Autohotkey..........

    - by metal gear solid
    i need functionality of this tool in Autohotkey keyboard shortcut. If i would select all code and press AHK key combination then code should be set like this tool does. single line/ multiline. Need to AHK script for both multiline and single line http://www.newmediacampaigns.com/files/posts/css-formatting/clean.php

    Read the article

  • Possible to capture and re-broadcast as RTMP?

    - by Jeremy White
    I may have a need coming up soon to capture a live video broadcast stream and re-broadcast it as an RTMP stream for playback in Flash Player. Is this possible? I'm seeing posts online from 2005 to 2009 claiming that RTMP either isn't or is poorly supported in VLC. I do not currently know what format the incoming video stream will be -- will update when I get that information.

    Read the article

  • Lenovo R61i - audio not working with windows 7

    - by ann o connor
    Has any one got a solution to this problem. I have installed windows 7 pro and installed audio (coexant) latest driver from the lenovo web site but it still does not work. I have seen many similar posts but no solution - just the usual - do you have the most recent driver.... etc. Is there any one that has solved this problem out there? (Driver details: Audio Driver 2.57 MB Normal Version 4.98.5.50)

    Read the article

  • Multiple Audio I/P and O/P simultaneaously

    - by Raj Naveen
    hi (1) i saw in one of your posts that it is possible to get different outputs in windows 7. i am eager to know more. Is there any way i can create a 2 or more virtual cable between two softwares simultaneously. so that simultaneously, two or more audio inputs will be routed to equal no of audio analysers receivers, and then the audio analysers send back a filtered audio back to respective audio inputs... Please reply to email id: [email protected]

    Read the article

  • Excel 2007 - "The Document Information Panel was unable to load"

    - by Ruffles
    In Excel 2007, if I go to Office button - Prepare - Properties instead of showing document properties, I get a message "The Document Information Panel was unable to load." I have come across a number of posts suggesting I copy ipedintl.dll from C:\Program Files\Microsoft Web Designer Tools\Office12\1033 to C:\Program Files\Microsoft Office\Office12\1033, however I have tried this, and the problem is still occurring. Does anyone have any other ideas of what this might be? Thanks.

    Read the article

  • How to use two external monitors on Alienware m17x along with laptop monitor (total 3 monitors)

    - by Steph
    I'd like to use the native 1920x1200 laptop monitor that comes with the Alienware m17x along with 2 additional external monitors, one through the displayport and another through the hdmi port. Is there any way to do this? And if so how? I've tried to update the nvidia drivers, I've installed ultramon, etc., but I can't seem to make it happen. I've seen posts that suggest it's possible, but I can't seem to figure out how.

    Read the article

  • Disable ipv6 support completely on debian squeeze 6.0.5

    - by markus
    I want to disable ipv6 support completely on debian squeeze 6.0.5. In many other posts I have seen setting the parameter net.ipv6.conf.all.disable_ipv6 = 1 in /etc/sysctl.conf should disable it. I've set that parameter and rebooted, but netstat -natp shows me that the ntp deamon is still using ipv6: udp6 0 0 :::123 :::* 0 7983 3138/ntpd Is there anything else I need to configure?

    Read the article

  • Virtual machine management on windows using vagrant and veewee [closed]

    - by Aidan
    I wish to use vagrant and possibly VeeWee to construct and maintain virtual machines to automate some testing of servers etc. I am having problems getting them up and running on windows. Is there any are there any takes-nothing-for-granted setup blog posts or instructions anywhere? I live in a Microsoft world so all this Ruby/Git is new (and exciting!) to me but it does mean that I could do with everything being spelled out to me in excruciating detail! Cheers

    Read the article

< Previous Page | 45 46 47 48 49 50 51 52 53 54 55 56  | Next Page >