diff --git a/backend/include/bs-utility.h b/backend/include/bs-utility.h index 983b647..f08a5cd 100644 --- a/backend/include/bs-utility.h +++ b/backend/include/bs-utility.h @@ -1,8 +1,10 @@ #ifndef PROTECTOR_UTILITY_H #define PROTECTOR_UTILITY_H +#include #include #include #include +#include #include #include #include @@ -69,8 +71,8 @@ class ReadWriteLock { private: std::mutex mtx; std::condition_variable cv; - int readers; - bool is_writing; + std::atomic readers; + std::atomic is_writing; public: ReadWriteLock(); @@ -84,4 +86,15 @@ class SessionClass { std::string SessionToken; std::string OuthorizationKey; }; +namespace BookStore_ZYM { +extern std::mutex debug_Print_Mutex; +} +void debugPrint(); +template +void debugPrint(Args... args) { + BookStore_ZYM::debug_Print_Mutex.lock(); + ((std::cerr << args), ...); + std::cerr << std::endl; + BookStore_ZYM::debug_Print_Mutex.unlock(); +} #endif // PROTECTOR_UTILITY_H \ No newline at end of file diff --git a/backend/include/schedule.h b/backend/include/schedule.h index 48ad0fc..d092084 100644 --- a/backend/include/schedule.h +++ b/backend/include/schedule.h @@ -1,6 +1,7 @@ #ifndef PROTECTOR_SCHEDULE_H #define PROTECTOR_SCHEDULE_H #include +#include #include "bs-utility.h" #include "engine.h" @@ -9,6 +10,7 @@ class BookStoreBackEndClass { BlockingStringStream *input_ptr; BlockingStringStream *output_ptr; BookStoreEngineClass *engine_ptr; + std::unordered_map session_map; public: BookStoreBackEndClass() = delete; diff --git a/backend/src/bs-utility.cpp b/backend/src/bs-utility.cpp index 359b230..a695521 100644 --- a/backend/src/bs-utility.cpp +++ b/backend/src/bs-utility.cpp @@ -24,7 +24,7 @@ void ReadWriteLock::endRead() { std::unique_lock lock(mtx); readers--; if (readers == 0) { - cv.notify_one(); // 唤醒一个等待的写操作 + cv.notify_all(); // 唤醒一个等待的写操作 } } @@ -40,4 +40,12 @@ void ReadWriteLock::endWrite() { std::unique_lock lock(mtx); is_writing = false; cv.notify_all(); // 唤醒所有等待的读操作和写操作 +} +namespace BookStore_ZYM { +std::mutex debug_Print_Mutex; +} +void debugPrint() { + BookStore_ZYM::debug_Print_Mutex.lock(); + std::cerr << std::endl; + BookStore_ZYM::debug_Print_Mutex.unlock(); } \ No newline at end of file diff --git a/backend/src/main.cpp b/backend/src/main.cpp index e97d0f5..58301ae 100644 --- a/backend/src/main.cpp +++ b/backend/src/main.cpp @@ -4,30 +4,57 @@ #include "bs-utility.h" #include "builtin-cli.h" #include "clipp/clipp.h" -void test() { - BlockingStringStream bss; +ReadWriteLock rwLock; +std::mutex mtx; +void readerFunc(int id) { + while (true) { + rwLock.startRead(); + debugPrint("Reader ", id, " is reading."); + std::this_thread::sleep_for(std::chrono::milliseconds(498)); + debugPrint("Reader ", id, " end reading."); + rwLock.endRead(); - std::thread reader([&bss]() { - std::string data; - for (int i = 1; i <= 5; ++i) { - // Use getline with string delimiter - bss.getline(data, '\n'); - std::cerr << "Received: " << data << std::endl; - } - }); - std::this_thread::sleep_for(std::chrono::seconds(1)); - std::thread writer([&bss]() { - for (int i = 1; i <= 5; ++i) { - bss << "Data " << i << '\n'; - std::this_thread::sleep_for(std::chrono::seconds(1)); - } - }); - reader.join(); - writer.join(); + // 模拟一些其他操作 + std::this_thread::sleep_for(std::chrono::milliseconds(502)); + } +} + +void writerFunc(int id) { + while (true) { + rwLock.startWrite(); + debugPrint("Writer ", id, " is writing."); + std::this_thread::sleep_for(std::chrono::milliseconds(1005)); + debugPrint("Writer ", id, " end writing."); + rwLock.endWrite(); + + // 模拟一些其他操作 + std::this_thread::sleep_for(std::chrono::milliseconds(1013)); + } +} +void test() { + std::thread readers[3]; + std::thread writers[2]; + + for (int i = 0; i < 3; ++i) { + readers[i] = std::thread(readerFunc, i + 1); + } + + for (int i = 0; i < 2; ++i) { + writers[i] = std::thread(writerFunc, i + 1); + } + + // 等待所有线程结束 + for (int i = 0; i < 3; ++i) { + readers[i].join(); + } + + for (int i = 0; i < 2; ++i) { + writers[i].join(); + } } int main(int argc, char **argv) { - // test(); - // return 0; + test(); + return 0; bool is_server = false; std::string config_dir = ""; bool custom_config_dir = false; diff --git a/docs/develop/开发文档.md b/docs/develop/开发文档.md index 872ab1c..02b4a1c 100644 --- a/docs/develop/开发文档.md +++ b/docs/develop/开发文档.md @@ -1,5 +1,5 @@ ~~未完待续,别扣我分~~ - +尚未定稿的内容见《总体设计文档》 **项目名称**:BookStore **作者**:Zhuang Yumin