分类: 未分类

39 篇文章

Debian快速更换镜像源
之前我曾经提供过快速更换Ubuntu镜像源的一键脚本,后续我发现偶尔也有意见修改Debian镜像源的需求。所以我又(让AI)准备了一个只需要输入到终端,即可自动将系统镜像源换成阿里云官方镜像源的脚本。希望对大家有所帮助。 bash -c 'set -e; shopt -s nullglob files=() [[ -f /etc/a…
C++多线程案例
一、引言 前面几篇文章主要在概念层面讲了std::thread、std::mutex、死锁和条件变量,这一篇我们换个方式,用一个可以编译运行的小工程,把这些东西全部串起来实际体验一遍。这个小工程的目标很简单,用C++11写一个小型线程池,主线程把一批任务丢进线程池,多个工作线程从共享任务队列中取任务执行。任务队列通过std::mutex和std::…
死锁如何形成?如何解决?
一、引言 当一个多线程程序在测试环境中偶尔出现“偶发卡死”时,很多人的第一反应是怀疑CPU、怀疑库、怀疑系统调用,实际上最常见的罪魁祸首是死锁。死锁的症状是几个线程互相等待,谁也走不下去,整个进程看起来像是挂起来了,但CPU占用可能不高。要理解死锁,就要把“线程-锁-资源”看成一个图。线程拿着一些资源,又在等待另一些资源,如果这张图里出现了一个环,…
std::mutex与RAII锁
一、引言 开线程本身并不难,难的是在线程之间安全地共享数据。如果一个进程里开了十几个线程,每个线程只做完全独立的计算,不读不写共享内存,那根本不需要任何同步原语,甚至单纯用函数参数和局部变量就够了。然而现实中的应用几乎不可能这么理想,你总要维护一些共享状态:请求队列、连接表、缓存、统计计数器等。一旦多个线程对同一个内存位置进行读写,问题就来了。如果…
讲讲std::thread
一、引言 很多C++程序员第一次写多线程代码时,都有类似的感受:std::thread t(f);这一行一写完,好像凭空多出一条执行线,程序自然而然就开始并行跑了。如果只停留在这个层面,你很难自觉地判断自己在做什么,譬如到底开了多少线程、这些线程在哪里跑、什么时候结束、资源谁来回收,以及它们和锁、条件变量之间到底是什么关系。要把多线程系统写稳定,就…
QTcpSocket在实时场景下的实战:缓冲区、错误处理与自动重连
在很多的桌面应用里,网络I/O往往只是“传个文件、调个接口”,延迟几百毫秒无伤大雅。但一旦进入实时场景,比如屏幕投射、语言通话、行情推送、多人协作编辑,网络链路里任何一个小小的等待、过大的缓冲区,都会被用户直接感觉出卡顿。Qt提供的QTcpSocket足够强大,但如果只是照着文档“连一下就完事”,通常得不到理想的实时效果。本文就借一个可复现的小案例…
百度云的服务器卸载hosteye
今天发现我有一台百度云服务器莫名奇妙的卡住了,一看原因是内存不足了。查了下内存不足的原因,有一个叫做heyeAgent的程序占用了不少的内存. 后来一查,heyeAgent,全名hosteye,是百度云给服务器安装的一个服务器杀毒软件,地址:https://cloud.baidu.com/doc/HOSTEYE/index.html 官方的卸载文档…
FireFox关闭AI悬浮按钮
火狐在某一个版本更新之后,出现了这个AI对话按钮,当我们选中一些文本的时候,这个按钮就会弹出,但是这个按钮有时候会挡住我们需要的其他的功能(比如我用的划词翻译)。这篇文章就是介绍下如何通过about:cofig关闭这个Firefox的AI悬浮按钮 操作方案 在地址栏前往about:config,搜索下面的配置项 browser.ml.chat.en…
宝塔面板的postgres安装PgVector插件
前言 我现在要部署的一个程序,需要使用postgres并且需要使用PgVector组件。而宝塔面板安装的postgres默认是没有(且无法自动化的)安装PgVector插件。这篇文章介绍下如何给宝塔面板部署的postgres安装PgVector插件(本文基于ubuntu,当然在Debian系列系统下操作相同),下面的命令均是使用root权限执行的。…
NEWAPI中sqllite迁移到postgresql
前言 本文转载https://linux.do/t/topic/261672这个帖子,并在该帖子的说明上上做出了相关的修改。 一开始我部署了一个newapi服务器,用于路由各种各样的ai请求,到了后面发现一开始使用的sqllite部署方案有诸多缺点,所以便想要将newapi的sqlite数据库迁移到部署的postgresql上面。本文使用的是宝塔一…