83 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			83 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								#include "zthread/channel.h"
							 | 
						||
| 
								 | 
							
								#include "zthread/channel_static.h"
							 | 
						||
| 
								 | 
							
								#include <iostream>
							 | 
						||
| 
								 | 
							
								#include <thread>
							 | 
						||
| 
								 | 
							
								#define LOOP_TIMES 1
							 | 
						||
| 
								 | 
							
								int del_count = 0;
							 | 
						||
| 
								 | 
							
								int add_count = 0;
							 | 
						||
| 
								 | 
							
								int cpy_count = 0;
							 | 
						||
| 
								 | 
							
								int mov_count = 0;
							 | 
						||
| 
								 | 
							
								using namespace std;
							 | 
						||
| 
								 | 
							
								class object {
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
									const char* name;
							 | 
						||
| 
								 | 
							
									int res;
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
									~object() {
							 | 
						||
| 
								 | 
							
										char buf[1024];
							 | 
						||
| 
								 | 
							
										sprintf(buf, "~~~~ %d %x \n", ++del_count, (int)this);
							 | 
						||
| 
								 | 
							
										std::cout << buf;
							 | 
						||
| 
								 | 
							
									};
							 | 
						||
| 
								 | 
							
									object(const char* name, int res = 0) {
							 | 
						||
| 
								 | 
							
										this->name = name;
							 | 
						||
| 
								 | 
							
										this->res = res;
							 | 
						||
| 
								 | 
							
										char buf[1024];
							 | 
						||
| 
								 | 
							
										sprintf(buf, "++++ %d %x \n", ++add_count, (int)this);
							 | 
						||
| 
								 | 
							
										std::cout << buf;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									object(object& obj) {
							 | 
						||
| 
								 | 
							
										char buf[1024];
							 | 
						||
| 
								 | 
							
										sprintf(buf, "cccc %d %x<--%x\n", ++cpy_count, (int)this, (int) & obj);
							 | 
						||
| 
								 | 
							
										std::cout << buf;
							 | 
						||
| 
								 | 
							
										this->name = obj.name;
							 | 
						||
| 
								 | 
							
										this->res = obj.res;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									object(object&& obj) noexcept{
							 | 
						||
| 
								 | 
							
										char buf[1024];
							 | 
						||
| 
								 | 
							
										sprintf(buf, "mmmm %d %x<--%x\n", ++mov_count, (int)this, (int)&obj);
							 | 
						||
| 
								 | 
							
										std::cout << buf;
							 | 
						||
| 
								 | 
							
										this->name = obj.name;
							 | 
						||
| 
								 | 
							
										this->res = obj.res;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								void test1() {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									zstd::channel<object> ch(16);
							 | 
						||
| 
								 | 
							
									auto p = [&]() {
							 | 
						||
| 
								 | 
							
										for (int i = 0; i < LOOP_TIMES * 2; i++) {
							 | 
						||
| 
								 | 
							
											this_thread::sleep_for(chrono::milliseconds(1000));
							 | 
						||
| 
								 | 
							
											ch.release("hello",i);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										std::cout << "product end " << ch.count() << "\n";
							 | 
						||
| 
								 | 
							
									};
							 | 
						||
| 
								 | 
							
									auto c = [&](int id) {
							 | 
						||
| 
								 | 
							
										for (int i = 0; i < LOOP_TIMES; i++) {
							 | 
						||
| 
								 | 
							
											this_thread::sleep_for(chrono::milliseconds(500));
							 | 
						||
| 
								 | 
							
											object obj = ch.acquire();
							 | 
						||
| 
								 | 
							
											int r = obj.res;
							 | 
						||
| 
								 | 
							
											char buf[1024];
							 | 
						||
| 
								 | 
							
											sprintf(buf, "recv %d %x head %d - %d\n", r, (int)&obj, ch.head() , ch.tail());
							 | 
						||
| 
								 | 
							
											std::cout << buf;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										std::cout << "consume end " << ch.count() << "\n";
							 | 
						||
| 
								 | 
							
									};
							 | 
						||
| 
								 | 
							
									thread t1(p);
							 | 
						||
| 
								 | 
							
									thread t2(c, 1);
							 | 
						||
| 
								 | 
							
									thread t3(c, 2);
							 | 
						||
| 
								 | 
							
									t1.join();
							 | 
						||
| 
								 | 
							
									t2.join();
							 | 
						||
| 
								 | 
							
									t3.join();
							 | 
						||
| 
								 | 
							
									std::cout << "test1:: res " << ch.count() << std::endl;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								void test2() {
							 | 
						||
| 
								 | 
							
									zstd::channel_static<object, 16> ch2;
							 | 
						||
| 
								 | 
							
									zstd::channel_static<object, 32> ch3;
							 | 
						||
| 
								 | 
							
									ch2.release("", 2);
							 | 
						||
| 
								 | 
							
									ch3.release("", 3);
							 | 
						||
| 
								 | 
							
									ch3.release("");
							 | 
						||
| 
								 | 
							
									ch2.release("");
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								int main() {
							 | 
						||
| 
								 | 
							
									test1();
							 | 
						||
| 
								 | 
							
									test2();
							 | 
						||
| 
								 | 
							
								}
							 |