Pipeline.h

#pragma once

#include "stdafx.h"

/**
 *   A pipeline is a simple comunication channel between two threads,
 *   one writes to the pipeline while another reads
 */
template <typename T>
class Pipeline {
public:
	Pipeline();
	void write( T value );
	T read();
private:
	bool empty;
	T value;
	/*  Mutex to coordinate threads */
	std::mutex mtx;
	/* Condition variable to signal between threads */
	std::condition_variable cv;	
};

template <typename T>
Pipeline<T>::Pipeline() :
empty(true) {
}

template <typename T>
void Pipeline<T>::write(T value) {
	std::unique_lock<std::mutex> lock(mtx);
	while (!empty) {
		cv.wait(lock);
	}
	empty = false;
	this->value = value;
	cv.notify_all();
}

template <typename T>
T Pipeline<T>::read() {
	std::unique_lock<std::mutex> lock(mtx);
	while (empty) {
		cv.wait(lock);
	}
	empty = true;
	cv.notify_all();
	return value;
}


void testPipeline();