随笔分类 -  Linux

Linux 编程,普通操作知识
摘要:目录线程池模型线程池的组成ThreadPool接口ThreadPool实现数据成员线程池的构造启动与停止往工作队列加入任务对象从工作队列取任务对象子线程loopThreadPool的使用、测试小结参考 muduo线程池ThreadPool,采用的是固定线程数目的线程池方案。 线程池模型 模型图如下: 阅读全文
posted @ 2022-03-08 11:44 明明1109 阅读(1063) 评论(0) 推荐(1) 编辑
摘要:目录后端AsyncLogging类数据成员LargeBuffer 存放大量log消息后端线程 异步写数据到log文件LogFile类构造函数滚动日志文件日志文件名写日志文件操作flush日志文件AppendFile类数据结构RAII方式打开、关闭文件写数据到文件使用异步日志小结参考 前半部分mudu 阅读全文
posted @ 2022-03-07 16:58 明明1109 阅读(1720) 评论(4) 推荐(2) 编辑
摘要:目录日志库模型前端Logger类日志等级类型LogLevel用户接口构造函数输出位置,冲刷日志日志等级,时区析构函数Impl类Impl的数据结构Impl构造函数LogStream类实现Small Buffer存放log消息operator<<格式化数据staticCheck()静态检查小结 后半部分 阅读全文
posted @ 2022-03-06 22:45 明明1109 阅读(3002) 评论(4) 推荐(2) 编辑
摘要:目录线程类Thread要解决的问题封装线程类ThreadThread 接口Thread 实现内部类ThreadData当前线程CurrentThreadcacheTid()获取当前线程tidisMainThread()判断调用线程是否为main线程sleepUsec() 休眠指定微秒数ThreadN 阅读全文
posted @ 2022-02-28 21:30 明明1109 阅读(699) 评论(5) 推荐(0) 编辑
摘要:目录多线程同步中的问题CountDownLatchCountDownLatch的接口CountDownLatch的实现barrier实现线程同步barrier与自定义CountDownLatch区别参考 多线程同步中的问题 多线程环境中,常有这样一种同步情况:一个线程等待其他所有线程完成指定工作。 阅读全文
posted @ 2022-02-28 11:22 明明1109 阅读(379) 评论(0) 推荐(0) 编辑
摘要:目录互斥锁mutex的选择MutexLock类MutexLockGuard类测试 互斥锁mutex的选择 互斥锁mutex有2种方案: 1)C++11以后,使用std::mutex,当然,特殊应用场景下,也有另外三种:std::recursive_mutex(递归mutex类),std::timed 阅读全文
posted @ 2022-02-27 23:36 明明1109 阅读(748) 评论(0) 推荐(0) 编辑
摘要:目录值语义与引用语义如何为一个class实现值语义,引用语义?定义标记class,标明对象拷贝性copyable classnoncopyable classcopyable及noncopyable应用阻止copy操作 值语义与引用语义 值语义指的是对象的拷贝与元对象无关,就像拷贝int一样。C++ 阅读全文
posted @ 2022-02-27 21:01 明明1109 阅读(282) 评论(0) 推荐(0) 编辑
摘要:目录原子操作AtomicIntegerT<T>模板类单元测试知识点gcc原子操作volatile关键字参考 原子操作 C++中的原子操作: 1)C++11以后,提供st::atomic<T>可以实现T类型数据的原子操作,主要包括:初始化、读取值、写值、自增自减(i.e. 前置或后置++)等。 2)对 阅读全文
posted @ 2022-02-27 20:44 明明1109 阅读(378) 评论(0) 推荐(0) 编辑
摘要:如何度量程序在某一时刻的时间? 通常,我们用时刻来表示,比如"2022-02-26 23:43:00.000000",这种方式便于人查看,但不便于程序中的比较和计算。比如有2个时刻A和B,计算哪个时刻在前,哪个在后,或者要计算时刻A和B的时间差时,这种字符串表示方式就很麻烦。 我们想到将字符串形式的 阅读全文
posted @ 2022-02-27 20:16 明明1109 阅读(913) 评论(0) 推荐(0) 编辑
摘要:Linux有2种方法可以实现线程局部存储: 1)使用NTPL提供的函数; 2)使用编译器扩展的__thread关键字。 NPTL(Native POSIX Thread Library),顾名思义,本地POSIX线程库。 1. 使用NPTL库函数实现线程局部存储 NPTL提供实现线程局部存储功能的接 阅读全文
posted @ 2022-02-24 23:24 明明1109 阅读(381) 评论(0) 推荐(0) 编辑
摘要:Linux中,我们知道getpid(2) 可以获取调用进程的pid,那么如何获取一个线程的id呢? 可以用系统调用gettid(2)获取内核中的线程id ,POSIX线程库提供的pthread_self(3)方法获取分配的线程id。C++11 std::thread的get_id()方法,封装的也是 阅读全文
posted @ 2022-02-24 10:22 明明1109 阅读(7543) 评论(0) 推荐(0) 编辑
摘要:前一节Linux backtrace()系列函数 ,已经知道可以通过backtrace,backtrace_symbols得到函数的调用栈信息。不过,在C++中,得到的是一堆难以识别的符号,如何解码得到准确的函数名信息? 如,前面得到的函数调用栈信息: $ ./backtrace 2 backtra 阅读全文
posted @ 2022-02-15 12:21 明明1109 阅读(346) 评论(0) 推荐(0) 编辑
摘要:timerfd特点 timerfd的特点是将时间变成一个文件描述符,定时器超时时,文件可读。这样就能很容易融入select(2)/poll(2)/epoll(7)的框架中,用统一的方式来处理IO事件、超时事件。这也是Reactor模式的特点。 timerfd定时器与传统Reactor模式定时器 传统 阅读全文
posted @ 2022-02-12 13:39 明明1109 阅读(4133) 评论(0) 推荐(2) 编辑
摘要:之前讲述了如何利用readdir/readdir_r,对指定目录进行遍历并输出,参见:Linux C 讲解系统调用readdir, readdir_r 以及如何遍历目录下的所有文件 这里讲述利用scandir和alphasort如何遍历指定目录,并对文件名排序输出。 scandir,alphasor 阅读全文
posted @ 2022-02-07 23:36 明明1109 阅读(4349) 评论(0) 推荐(0) 编辑
摘要:系统调用基本概念 为了和用户空间上运行的进程进行交互,内核提供了一组接口,透过该接口,应用程序可以访问硬件设备和其他操作系统资源。这组接口称为系统调用。 系统调用是用户空间和硬件设备之间添加的一个中间层,主要作用: 1)为用户空间提供一种硬件的抽象接口。 2)保证系统的稳定和安全。 3)每个进程都运 阅读全文
posted @ 2022-02-02 00:07 明明1109 阅读(1010) 评论(0) 推荐(0) 编辑
摘要:背景 Linux中断上半部,参见Linux中断和中断处理程序 。 Linux中断下半部,参见Linux中断下半部及推后执行的工作。 这部分讲Linux内核中断和中断处理程序。 [ ] 中断 硬件中断 -- 异步中断 中断本质上是一种电信号,由硬件设备发出,用于通知处理器特定事件。 不同设备对应不同中 阅读全文
posted @ 2022-01-30 14:00 明明1109 阅读(2539) 评论(0) 推荐(1) 编辑
摘要:这部分讲Linux内核定时器。 基本概念 系统定时器:一种可编程硬件芯片,能以固定频率产生中断。 定时器中断:系统定时器固定时间周期产生的中断,其中断处理程序负责更新系统时间,执行周期性任务。 动态定时器:一种用来推迟执行程序的工具。内核可以动态创建、销毁动态定时器。 节拍率(tick rate): 阅读全文
posted @ 2022-01-26 12:44 明明1109 阅读(2267) 评论(0) 推荐(0) 编辑
摘要:这部分讲操作系统内核中的并发和同步问题。 为什么需要同步? 因为计算机中很多共享的资源有限,如共享内存,在同一时间被多个执行并发访问的话,有可能发生各个线程间相互覆盖共享数据的情况,造成访问数据处于不一致状态,从而造成系统不稳定的隐患,而且很难跟踪和调试。 而同步就是保护共享资源的手段,避免同一时刻 阅读全文
posted @ 2022-01-24 22:32 明明1109 阅读(130) 评论(0) 推荐(0) 编辑
摘要:Linux内核提供一组同步方法,用于避免共享数据之间的竞争: 内核态进程的非抢占性 原子操作 关中断 锁 [ ] 内核态进程的非抢占性 Linux内核是非抢占的:正在运行的进程处于内核态时,不会被抢占,即使来了优先级更高进程。 以下断言,在Linux中总是成立: 内核态运行的进程不会被其他进程取代, 阅读全文
posted @ 2022-01-23 23:56 明明1109 阅读(223) 评论(0) 推荐(0) 编辑
摘要:11.1 入口函数和程序初始化 11.1.1 程序从main开始吗? 先看3个程序 程序1(C): #include <stdio.h> #include <stdlib.h> int a = 3; int main(int argc, char *argv[]) { int *p = (int * 阅读全文
posted @ 2021-11-06 10:44 明明1109 阅读(890) 评论(0) 推荐(0) 编辑