// // Created by anton on 6/22/22. // #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "call_frame.h" #include "global_thread_pool.h" #include "helpers.h" using namespace pmp::core; void *task1(void *args, void *scope) { //std::cout << "hello from task 1" << std::endl; assert(("Scope can't be nullptr", scope != nullptr)); auto *print_lock = reinterpret_cast(scope); using u64 = unsigned long long int; u64 word = 0; u64 len = 0; long long int seed = 0; std::random_device dev; // FIXME: random_device entropy seems to be stuck at 0. // currently falling back to libsodium, but that's not sustainable. if (dev.entropy() == 0) { randombytes_buf(&seed, sizeof(long long int)); } else { seed = dev(); } std::mt19937 rng(seed); std::uniform_int_distribution next_number(0, 26); std::map lengths; //std::unordered_map words; for (u64 i = 0; i < 10000000; i++) { unsigned long num = next_number(rng); if (num == 0) { lengths[len]++; //words[word]++; word = 0; len = 0; continue; } word *= 26; word += num; len++; } print_lock->lock(); std::cout << "Word lengths:\n"; for (auto& pair : lengths) { if (pair.first > 20) { break; } std::cout << pair.first << ": " << pair.second << "\n"; } std::cout << "Most used words:\n"; print_lock->unlock(); return nullptr; } int main() { sodium_init(); std::cout << "Hello, World!" << std::endl; auto pool = global_thread_pool(nullptr); std::mutex stdout_lock; std::cout << "Using " << pool.thread_count() << " workers" << std::endl; for (int i = 0; i < 2; i++) { pool.insert_frame(nullptr, &stdout_lock, task1, 0); } std::cout << pool.insert_frame(nullptr, &stdout_lock, task1,0) << std::endl; pool.join(); return 0; }