void AsyncByteStream::Open(std::ios::openmode mode)
{
    if ( (mode & std::ios::in) == std::ios::in )
    {
        _readbuf = std::make_shared<RingBuffer>(_bufsize);
    }
    if ( (mode & std::ios::out) == std::ios::out )
    {
        _writebuf = std::make_shared<RingBuffer>(_bufsize);
    }
    
    if ( _targetRunLoop != nullptr )
        ReadyToRun();
}
void NonBlockingAlgorithm::StartAlgorithm()
{
  if ( !ReadyToRun() ) return; // let algorithm check if all input/parameters are ok
  if (m_KillRequest) return; // someone wants us to die

   m_ParameterListMutex->Lock();
     m_ThreadParameters.m_Algorithm = this;
     ++m_UpdateRequests;
   m_ParameterListMutex->Unlock();
  if (m_ThreadID != -1) // thread already running. But something obviously wants us to recalculate the output
  {
    return; // thread already running
  }

   // spawn a thread that calls ThreadedUpdateFunction(), and ThreadedUpdateFinished() on us
   itk::ThreadFunctionType fpointer = &StaticNonBlockingAlgorithmThread;
   m_ThreadID = m_MultiThreader->SpawnThread( fpointer, &m_ThreadParameters);
}