You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					36 lines
				
				675 B
			
		
		
			
		
	
	
					36 lines
				
				675 B
			| 
											6 years ago
										 | #ifndef CHANNEL_HPP
 | ||
|  | #define CHANNEL_HPP
 | ||
|  | 
 | ||
|  | #include <mutex>
 | ||
|  | #include <list>
 | ||
|  | #include <condition_variable>
 | ||
|  | 
 | ||
|  | template<class item>
 | ||
|  | class channel {
 | ||
|  | private:
 | ||
|  |   std::list<item> queue;
 | ||
|  |   std::mutex m;
 | ||
|  |   std::condition_variable cv;
 | ||
|  | public:
 | ||
|  |   void put(const item &i) {
 | ||
|  |     std::unique_lock<std::mutex> lock(m);
 | ||
|  |     queue.push_back(i);
 | ||
|  |     cv.notify_one();
 | ||
|  |   }
 | ||
|  |   void put_front(const item &i) {
 | ||
|  |     std::unique_lock<std::mutex> lock(m);
 | ||
|  |     queue.push_front(i);
 | ||
|  |     cv.notify_one();
 | ||
|  |   }
 | ||
|  |   item get() {
 | ||
|  |     std::unique_lock<std::mutex> lock(m);
 | ||
|  |     cv.wait(lock, [&](){ return !queue.empty(); });
 | ||
|  |     item result = queue.front();
 | ||
|  |     queue.pop_front();
 | ||
|  |     return result;
 | ||
|  |   }
 | ||
|  | };
 | ||
|  | 
 | ||
|  | #endif
 | ||
|  | 
 |