Split circular buffer's finish() method up into the put and get pointers, so consumers are also enabled to finish early.
Consumer threads can now be aborted any time. The producer will then abort as well when the shared buffer runs full.