c++11智能指针的线程安全问题以及实现

智能指针: 究竟是个什么东西?

c++11中提供了智能指针, 它主要就是维持了引用计数, 在引用计数值为0时可以安全析构。shared_ptr是个值语义, 在它析构时, 引用计数会减小, 直到计数减为0时, 才会delete智能指针里面保存的指针本体。

用Go语言做一个QQ GPT机器人

胡言乱语

最近在学muduo, 但是由于c++水平太弱, 导致我脑子快给想秃了。于是今天早上心血来潮想做点好的东西消遣下, 给qq机器人接入个ChatGPT。我想实现的最终效果是这样的(这是别的群的机器人, 即灵感来源):

linux线程私有数据的原理

线程私有数据的应用

errno, pthread_self()都是线程私有数据。比如”名字”, 每个线程都有, 但却各不相同。muduo库使用了gcc提供__thread做到了这点(类似于c++11提供的thread_local, 它们基本等价)。此外pthread也提供了线程私有数据的支持。

如何使用linux基础设施timerfd和eventfd

前言

最近拜读陈硕所著的《Linux多线程服务端编程》, 收获颇多。作者用epoll多路复用+非阻塞IO实现了Reactor服务端框架muduo。其中使用了linux的高级特性timerfd做定时器, eventfd做事件通知, 统一用epoll做多路复用。为了后续muduo的学习, 本文仅仅探索这两个基础设施的用法。

tty之ssh的基本实现原理

前言

linux服务器用户直接使用终端与服务器交互, 用户可以执行各种命令, 如果电脑上装的是linux无桌面版本, 那么点击开机键, 不久就能见到屏幕上提示登陆的信息, 用户登陆后能进行各种操作, 这个黑色的命令行界面就是终端。

此外, 桌面版本的linux用户虽然没有直接使用终端, 却能够用类似konsole的终端模拟器与终端交互。此外我们在本地的linux终端上输入ssh 对端服务器的ip, 能够连接到远端服务器, 也能与终端进行交互。这两种场景都离不开伪终端的作用

阅读本文可以知道伪终端的基本概念, 知道如何实现一个终端模拟器, 知道如何实现一个ssh或者screen那样的软件, 下面是前置知识, 务必阅读。

Golang库推荐: tcell实现对终端的坐标式绘图

引入话题

vim无疑是linux玩家必备的编辑工具, 即使在命令行模式下(假如你现在在使用linux桌面版, 现在你可以按下CTRL+ALT+F2进入命令行模式, 按CTRL+ALT+F1切回), 也能使用这样的编辑工具。它能够接管整个屏幕, 并将文字显示在上面。那么怎么实现这种”接管”整个终端屏幕的软件呢?在golang下就提供了tcell这样方便的工具, 使得我们能以坐标系的方式操纵整个终端屏幕。

锁的基本原理(3)

如何降低无意义的自旋损耗?

前两节, 我们实现了自旋锁, 然而自旋锁很拉跨, 它会占用线程的执行时间去做没有意义的自旋操作。也就是说, 自旋属于没有意义的性能损耗, 如果可以, 我们更希望内核此时停止调度这个线程, 转而去执行其它线程, 等待锁空闲的时候, 再回来调度此线程, 借此提高cpu利用率