title: Efficient consumer thread with multiple producers
body: <p>I am trying to make a producer/consumer thread situation more efficient by skipping expensive event operations if necessary with something like:</p>
  
  <pre><code>//cas(variable, compare, set) is atomic compare and swap
  //queue is already lock free
  
  running = false
  
  
  // dd item to queue – producer thread(s)
  
  if(cas(running, false, true))
  {
    // We effectively obtained a lock on signalling the event
    add_to_queue()
    signal_event()
  }
  else
  {
    // Most of the time if things are busy we should not be signalling the event
    add_to_queue()
  
    if(cas(running, false, true))
      signal_event()
  }
  
  ...
  
  // Process queue, single consumer thread
  
  reset_event()
  
  while(1)
  {
    wait_for_auto_reset_event() // Preferably IOCP
  
    for(int i = 0; i &amp;lt SpinCount; ++i)
      process_queue()
  
    cas(running, true, false)
  
    if(queue_not_empty())
      if(cas(running, false, true))
        signal_event()
  }
  </code></pre>
  
  <p>Obviously trying to get these things correct is a little tricky(!) so is the above pseudo code correct?  A solution that signals the event more than is exactly needed is ok but not one that does so for every item.</p>