Fixed issue with threads leftovers
This commit is contained in:
		
							parent
							
								
									a4f722f6fb
								
							
						
					
					
						commit
						d7ea7c8866
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -6,3 +6,4 @@ gmon\.out
 | 
				
			|||||||
cmake-build-debug/
 | 
					cmake-build-debug/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\.idea/
 | 
					\.idea/
 | 
				
			||||||
 | 
					*.lzw
 | 
				
			||||||
 | 
				
			|||||||
@ -116,18 +116,18 @@ void compress(const std::string &t_in_file, const char *t_out_file) {
 | 
				
			|||||||
  // const auto comp_str{lzw_compress(str, dictionary)};
 | 
					  // const auto comp_str{lzw_compress(str, dictionary)};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // thread pool
 | 
					  // thread pool
 | 
				
			||||||
  std::vector<std::pair<std::thread, uvec>> threads{};
 | 
					  std::vector<std::pair<std::unique_ptr<std::thread>, uvec>> threads{};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // char chunk[32768];
 | 
					  // char chunk[32768];
 | 
				
			||||||
  std::vector<char> chunk{};
 | 
					  std::vector<char> chunk{};
 | 
				
			||||||
  chunk.reserve(32768);
 | 
					  chunk.reserve(32768);
 | 
				
			||||||
  while (input_file.read(chunk.data(), 32768)) {
 | 
					  while (input_file.read(chunk.data(), 32768)) {
 | 
				
			||||||
    threads.push_back(std::make_pair(std::thread{}, uvec{}));
 | 
					    threads.push_back(std::make_pair(nullptr, uvec{}));
 | 
				
			||||||
    threads.back().first =
 | 
					    threads.back().first = std::make_unique<std::thread>(
 | 
				
			||||||
        std::thread{lzw_compress, chunk, ref(threads.back().second)};
 | 
					        std::thread{lzw_compress, chunk, ref(threads.back().second)});
 | 
				
			||||||
    if (threads.size() >= 8) {
 | 
					    if (threads.size() >= 8) {
 | 
				
			||||||
      for (auto &elem : threads) {
 | 
					      for (auto &elem : threads) {
 | 
				
			||||||
        elem.first.join();
 | 
					        (*elem.first).join();
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      for (auto &elem : threads) {
 | 
					      for (auto &elem : threads) {
 | 
				
			||||||
        for (const auto c : elem.second) {
 | 
					        for (const auto c : elem.second) {
 | 
				
			||||||
@ -138,6 +138,18 @@ void compress(const std::string &t_in_file, const char *t_out_file) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if(threads.size() != 0) {
 | 
				
			||||||
 | 
					    for (auto &elem : threads) {
 | 
				
			||||||
 | 
					      (*elem.first).join();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    for (auto &elem : threads) {
 | 
				
			||||||
 | 
					      for (const auto c : elem.second) {
 | 
				
			||||||
 | 
					        write_utf8(out, c);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    threads.clear();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if(input_file.tellg() != std::ios::end) {
 | 
					  if(input_file.tellg() != std::ios::end) {
 | 
				
			||||||
    std::puts("Leftovers...");
 | 
					    std::puts("Leftovers...");
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user