From 7868ccecdde497994cfe8c9499418be4f5b4faa7 Mon Sep 17 00:00:00 2001 From: un-lock-able Date: Mon, 21 Apr 2025 23:54:18 +0800 Subject: [PATCH] add teller threading --- lab1/Makefile | 4 +-- lab1/banker.c | 6 ---- lab1/banker.cpp | 73 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 8 deletions(-) delete mode 100644 lab1/banker.c create mode 100644 lab1/banker.cpp diff --git a/lab1/Makefile b/lab1/Makefile index 1836742..81f364a 100644 --- a/lab1/Makefile +++ b/lab1/Makefile @@ -1,9 +1,9 @@ OUT_DIR := build OUT_BIN := $(OUT_DIR)/banker -$(OUT_BIN): banker.c +$(OUT_BIN): banker.cpp mkdir -p $(OUT_DIR) - gcc -pthread banker.c -o $(OUT_BIN) + g++ -pthread banker.cpp -o $(OUT_BIN) .PHONY: run run: $(OUT_BIN) diff --git a/lab1/banker.c b/lab1/banker.c deleted file mode 100644 index 293aacb..0000000 --- a/lab1/banker.c +++ /dev/null @@ -1,6 +0,0 @@ -#include -#include - -int main() { - return 0; -} \ No newline at end of file diff --git a/lab1/banker.cpp b/lab1/banker.cpp new file mode 100644 index 0000000..68fc75d --- /dev/null +++ b/lab1/banker.cpp @@ -0,0 +1,73 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define TELLER_NUM 5 +#define TIME_GRAN_MSEC 200 + +std::atomic bank_open = false; +std::mutex custom_q_mtx; +std::counting_semaphore custom_num_sem; + +std::deque customer_q; + + +struct CustomerInfo { + unsigned int id; + unsigned int arrival_time; + unsigned int service_time; +}; + +struct Customer { + unsigned int id; + unsigned int service_time; +}; + +void teller_thread(int id, std::chrono::time_point start_tick) { + std::cout << "Teller id " << id << " started\n"; + std::chrono::time_point curr_tick = start_tick; + bool is_serving = false; + std::chrono::time_point start_serving_time; + struct Customer curr_customer; + while (bank_open) { + if (is_serving && ((curr_tick - start_serving_time) / TIME_GRAN_MSEC) >= curr_customer.service_time) { + + } + std::cout << "Teller id " << id << " waiting request\n"; + + + curr_tick += std::chrono::milliseconds(TIME_GRAN_MSEC); + std::this_thread::sleep_until(curr_tick); + } + std::cout << "Teller id " << id << " closing\n"; +} + +int main() { + bank_open = true; + + std::vector tellers; + for (int i = 0; i < TELLER_NUM; ++i) { + try { + tellers.emplace_back(teller_thread, i); + } catch (const std::system_error& e) { + std::cerr << "Failed to create thread, i = " << i << ": " << e.what() << '\n'; + } + } + + std::this_thread::sleep_for(std::chrono::milliseconds(5 * TIME_GRAN_MSEC)); + std::cout << "Closing all child\n"; + bank_open = false; + + for (auto& t : tellers) { + if (t.joinable()) { + t.join(); + } + } + + return 0; +} \ No newline at end of file