On 3/4/2014 10:55 AM, Jon Elson wrote: > Another way this can be dealt with is to have double buffers > shared between the two tasks, the "master" task swaps out a > pointer > to the most recent buffer when it is ready to be used by the > "slave" task. Not sure that is a great way to do things, but > it alleviates the deadlock situation.
You are describing a degenerate ring buffer with two elements. The writing side creates and writes a "chunk" of data, then updates a pointer to it. The read side checks the pointer, and if it has changed, it reads the new data. This process is non-blocking on both sides, cannot deadlock, needs no critical sections, and only requires two guarantees to work properly: 1) The pointer value can be updated atomically. Most modern systems have a way of insuring that values up to 32 bits can be updated atomically, and HAL has been relying on this for ages. Not a problem. 2) The "chunk" of data needs to be written to physical memory (or whatever is used for communications) before the pointer is atomically updated. This is not as easy as it sounds on modern multi-core hardware, but in any system where it matters, you will find some form of a memory "fence" instruction, that allows software to insure that all pending writes occur prior to any subsequent writes. There are similar requirements that need to be met on the read side, but let's not turn this into Parallel Processing Intercommunication 101, I've already been through all this with Michael. It turns out gcc even has special helpers to make all of this magic easy to use in portable code, with no need to hack assembly language with a bunch of ifdefs for the various CPU families and cache handling semantics like back in the "good old days". -- Charles Steinkuehler [email protected] ------------------------------------------------------------------------------ Subversion Kills Productivity. Get off Subversion & Make the Move to Perforce. With Perforce, you get hassle-free workflows. Merge that actually works. Faster operations. Version large binaries. Built-in WAN optimization and the freedom to use Git, Perforce or both. Make the move to Perforce. http://pubads.g.doubleclick.net/gampad/clk?id=122218951&iu=/4140/ostg.clktrk _______________________________________________ Emc-developers mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/emc-developers
