并发编程02-线程管控
介绍线程的基本管控,包括线程的发起,等待,异常条件下如何等待, 后台运行,线程的join,detach,以及识别线程,归属权转移,如何管理等等。 线程发起可以传入用户函数,仿函数,lamda表达式 仿函数作为参数1234567891011class MyFunc{public: void operator()(std::string str){std::cout<<}};MyFunc myfunc;###############错误初始化:直接传入std::thread t2(myfunc());t2.join();#################正确初始化std::thread t3((myfunc());std::thread t4{mgfunc()}; 为什么不能直接传入,还要加一层括号或者大括号? 因为编译器会把t2当作一个函数对象,返回值是thread,参数是一个返回值为back_task,参数为空的函数指针 1"std::thread (*)(background_task...
并发编程01-thread原理
介绍thread源码,运行机制,看完可以知道参数在线程中的传递过程,为什么不让拷贝构造,为什么左值引用会编译错误,想利用左值引用修改参数该怎么办,指针参数传递的过程. 先看源码 thread构造函数内部通过forward原样转换传递给_Start函数。 1234template <class _Fn, class... _Args, enable_if_t<!is_same_v<_Remove_cvref_t<_Fn>, thread>, int> = 0>_NODISCARD_CTOR explicit thread(_Fn&& _Fx, _Args&&... _Ax) { _Start(_STD forward<_Fn>(_Fx), _STD forward<_Args>(_Ax)...);} **template <class _Fn, class… _Args,...
一些记录
emo了几天,也缓过来了,睡醒之后突然就有了很多力气,突然就有心气了,烂命一条就是干,老老实实推倒重来,复习的同时填充博客,我曾经掌握过.虽然想起来还是会难过,但至少也不会内耗了,重新看文档学也还蛮有意思的,就是很担心自学一年也比不上公司一星期. 消极情绪的外溢也是会影响身边人的.继续往下走吧,累了就休息.
聊天项目笔记(3)
RPC封装因为跨服踢人,所以要调用Grpc踢人,我们在message.proto中添加踢人消息 12345678message KickUserReq{ int32 uid = 1;}message KickUserRsp{ int32 error = 1; int32 uid = 2;} 同时添加服务调用 1234service ChatService { //...其他服务略去 rpc NotifyKickUser(KickUserReq) returns (KickUserRsp){}} 编写bat脚本自动生成, start.bat内容如下 123456789101112@echo offset PROTOC_PATH=D:\cppsoft\grpc\visualpro\third_party\protobuf\Debug\protoc.exeset...
一些记录
杂乱的思绪 我也想取得亮眼的成就,安置早想退休的父母,闪亮着走向喜欢的人,有能力为自己的情感负责,一切又都离我那么那么远了,不可及亦不可望。 我也想骗自己,要是不去问该多好,那样我就可以心安理得的,心安理得的,心安理得的度过一段比较愉快的时光,那样的日子我是有盼头的,有自信的,有野心的,可事件发展早有预感我又如何去欺骗自己。有一肚子的不是滋味想与人说,但他人没有缘由应当承受我的沉重,是我没有好好努力,哪怕没有那句口头承诺,我也不应该放弃学习,觉得岁月静好,落得这样一个不知如何起步的下场。 当然明白写下这段文字的我此刻十分消极,十分偏激,但我不知道怎么办了。微信欠着几条消息,我不知道该怎么办了。 列车不断向前,送一批批乘客到他们的终点站,我的终点站又在哪里呢?
聊天项目笔记(2)
为什么需要踢人逻辑?同账户异地登陆,需要将原有的连接断开,先发送下线信息到旧账号的客户端,然后关闭连接. 客户端去断开连接,避免服务器主动断开造成大量time_wait问题. 为什么需要分布式锁?C/C++新客户端登录,需要通过redis存储用户uid与分配的服务器ip;而旧客户端下线,也会抹掉uid对应的服务器ip,存在一个互斥资源的访问,故而需要分布式锁. 分布式锁设计逻辑这里使用redis作为锁存储. 客户端通过设置redis的键来加锁,通过redis的原子操作保证只有一个客户端成功设置该键,加锁时生成uuid以标识锁持有者.只有锁持有者才能释放锁 尝试加锁12345678910111213141516171819202122// 尝试获取锁,返回锁的唯一标识符(UUID),如果获取失败则返回空字符串std::string acquireLock(redisContext* context, const std::string& lockName, int lockTimeout, int acquireTimeout) { ...
一些记录
随笔 以前的东西经常发在平台上,突然想起来自己做了这个博客,不用白不用,也免得被平台推送给我认识的朋友了,不过这玩意写东西还真是不方便啊。随便写写吧,也不指望谁会看见。 时常感觉对任何人都没有一点探索欲,但我也确定自己的精神状态是正常的,只是,对人好像不再产生兴趣了,同性也好异性也好。 昨天还是前天吧,她换了一个特别甜美可爱的头像,是好看的,但聊缩力爆表,,,因为,很多xxn也是这种头像,遇到这种我都是能躲多远就多远,这是-很深的刻板印象。 临近毕业也挺多事的,说忙吧也还好,还能刷刷抖音,说不忙吧,任务清单倒也没空过。很久没有一个人出去走走了,偶尔有想法但总是因为天气、突发事件耽搁。 我总是在很笨拙的表达,这让丰富感知的我感到气馁,那些人与人之间溢出的情感,我都统统装进瓶子里,渴望能够让表达像一股脑倒出瓶中物那般清爽,可我的瓶子总是漏的,情绪总在半路就纷纷洒落,留下的不是精华,是张嘴难言的无可奈何。
C++八股
静态变量 全局变量...
聊天项目笔记(1)
.\redis-server.exe .\redis.windows.conf sk-6d764c328eb8430eaf5b2effd44d6b2e 文本信息存在TEXTBUBBLE里,用QTextEdit管理 针对大文件传输过程,采用分块传输与环形缓冲区设计,优化分块传输协议提升传输效率,结合TCP长连接实现断点续传。传输进度通过双ACK机制保障,客户端发送分块后等待服务端ACK,服务端写入磁盘后返回客户端ACK;针对离线消息存储,采用Redis...
操作系统八股
...