From 513c59776847816d3b4eaa6055f91dd0a435c375 Mon Sep 17 00:00:00 2001 From: Xianglin_Wang <1830638446@qq.com> Date: Fri, 22 Dec 2023 17:01:50 +0800 Subject: [PATCH 1/2] init commit --- main.cpp | 46 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/main.cpp b/main.cpp index f4ecab8..73498d3 100644 --- a/main.cpp +++ b/main.cpp @@ -6,6 +6,11 @@ #include #include #include +#include +#include +#include +#include +#include struct User { @@ -15,12 +20,16 @@ struct User { }; std::map users; -std::map has_login; // 换成 std::chrono::seconds 之类的 +std::map has_login; // 换成 std::chrono::seconds 之类的 +std::shared_mutex sm; +std::shared_mutex sm_login; // 作业要求1:把这些函数变成多线程安全的 // 提示:能正确利用 shared_mutex 加分,用 lock_guard 系列加分 std::string do_register(std::string username, std::string password, std::string school, std::string phone) { - User user = {password, school, phone}; + User user = {std::move(password), std::move(school), std::move(phone)}; + + std::unique_lock grd(sm); if (users.emplace(username, user).second) return "注册成功"; else @@ -29,13 +38,29 @@ std::string do_register(std::string username, std::string password, std::string std::string do_login(std::string username, std::string password) { // 作业要求2:把这个登录计时器改成基于 chrono 的 - long now = time(NULL); // C 语言当前时间 - if (has_login.find(username) != has_login.end()) { - int sec = now - has_login.at(username); // C 语言算时间差 - return std::to_string(sec) + "秒内登录过"; +// long now = time(NULL); // C 语言当前时间 +// if (has_login.find(username) != has_login.end()) { +// int sec = now - has_login.at(username); // C 语言算时间差 +// return std::to_string(sec) + "秒内登录过"; +// } +// has_login[username] = now; + + std::shared_lock grd_log_sl(sm_login); + auto find=has_login.find(username) != has_login.end(); + grd_log_sl.unlock(); + + auto now=std::chrono::steady_clock::now(); + if (find) { + auto sec=now-has_login.at(username); + using double_s=std::chrono::duration; + double s=std::chrono::duration_cast(sec).count(); + return std::to_string(s) + "秒内登录过"; } + std::unique_lock grd_log(sm_login); has_login[username] = now; + grd_log.unlock(); + std::shared_lock grd(sm); if (users.find(username) == users.end()) return "用户名错误"; if (users.at(username).password != password) @@ -44,7 +69,9 @@ std::string do_login(std::string username, std::string password) { } std::string do_queryuser(std::string username) { + std::shared_lock grd(sm); auto &user = users.at(username); + grd.unlock(); std::stringstream ss; ss << "用户名: " << username << std::endl; ss << "学校:" << user.school << std::endl; @@ -57,8 +84,10 @@ struct ThreadPool { void create(std::function start) { // 作业要求3:如何让这个线程保持在后台执行不要退出? // 提示:改成 async 和 future 且用法正确也可以加分 - std::thread thr(start); +// std::thread thr(start); + fts.push_back(std::async(start)); } + std::vector> fts; }; ThreadPool tpool; @@ -85,5 +114,8 @@ int main() { } // 作业要求4:等待 tpool 中所有线程都结束后再退出 + for (auto &ret:tpool.fts) { + ret.get(); + } return 0; } From 92867a36ddb5a0956bac8bec17f8778148aa2dec Mon Sep 17 00:00:00 2001 From: Xianglin_Wang <1830638446@qq.com> Date: Fri, 22 Dec 2023 18:08:07 +0800 Subject: [PATCH 2/2] finish --- main.cpp | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/main.cpp b/main.cpp index 73498d3..f0e25fc 100644 --- a/main.cpp +++ b/main.cpp @@ -20,7 +20,7 @@ struct User { }; std::map users; -std::map has_login; // 换成 std::chrono::seconds 之类的 +std::map has_login; // 换成 std::chrono::seconds 之类的 std::shared_mutex sm; std::shared_mutex sm_login; @@ -46,16 +46,18 @@ std::string do_login(std::string username, std::string password) { // has_login[username] = now; std::shared_lock grd_log_sl(sm_login); - auto find=has_login.find(username) != has_login.end(); - grd_log_sl.unlock(); +// auto find=; auto now=std::chrono::steady_clock::now(); - if (find) { + if (has_login.find(username) != has_login.end()) { auto sec=now-has_login.at(username); + using double_s=std::chrono::duration; double s=std::chrono::duration_cast(sec).count(); return std::to_string(s) + "秒内登录过"; } + grd_log_sl.unlock(); + std::unique_lock grd_log(sm_login); has_login[username] = now; grd_log.unlock(); @@ -69,13 +71,19 @@ std::string do_login(std::string username, std::string password) { } std::string do_queryuser(std::string username) { - std::shared_lock grd(sm); - auto &user = users.at(username); - grd.unlock(); std::stringstream ss; - ss << "用户名: " << username << std::endl; - ss << "学校:" << user.school << std::endl; - ss << "电话: " << user.phone << std::endl; + try { + std::shared_lock grd(sm); + auto &user = users.at(username); + grd.unlock(); + ss << "用户名: " << username << std::endl; + ss << "学校:" << user.school << std::endl; + ss << "电话: " << user.phone << std::endl; + } + catch (...) { + std::cout<<"username: "<