- 博客(11)
- 收藏
- 关注
原创 Linux下C++ 基于回调实现事件驱动
事件循环(Event Loop)等待事件的发生(如I/O事件、定时器事件等),然后调用预先注册的回调函数来处理这些事件。上面的代码,事件真正的消费处理和都是在主进程中执行,如果比较耗时,可能会影响执行其他的业务,并且当有多个绑定的事件消费处理者都在等待处理时,我们怎么样想让我们最想执行的业务最先执行?但是,如果我们的系统比较简单,事件类型固定,且每个事件只有一个处理函数,那么直接调用可能更简单。:同一个事件可以有多个处理者(多个回调函数),事件产生者只需要通知一次,回调管理器会调用所有注册的回调。
2025-10-18 16:58:38
776
原创 C++问题思考3
在C++中,“三/五/零规则”是关于类设计时,关于特殊成员函数(特别是拷贝构造函数、拷贝赋值运算符、析构函数,以及C++11引入的移动构造函数和移动赋值运算符)的指导原则。五法则:在C++11及更高版本中,如果自定义了其中一个特殊成员函数(析构函数、拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符),则很可能也需要自定义其他所有相关的特殊成员函数。声明了一个接受两个const Node&参数的构造函数,如果确实需要这个构造函数,需要确保它的语义是清晰的,并且与其他可能的操作不冲突。
2024-08-17 18:27:45
626
原创 C++ 问题思考2
如果String类在内部使用了某种形式的内存管理(如智能指针、自动内存释放等),那么直接修改这些内存可能会破坏String对象的状态,导致内存泄漏、双重释放或其他内存管理问题。此外,我们还提供了一个c_str成员函数来返回一个指向内部数据的const char*指针,这是安全的,因为外部代码不能通过这个指针来修改字符串的内容。下面是一个更安全的代码demo,其中我们避免了直接在String对象外部修改其内部状态,而是通过在String类内部添加一个成员函数来实现去除空格的功能。将const char。
2024-08-16 15:15:41
509
原创 C++ 问题思考
在C++中,我们的File类假设所有的File对象都表示一个唯一的文件描述符—对一个File进行复制会产生一个新的描述符。假设我们希望复制一个File对象时只产生一个和该对象共享已有描述符的对象—也就是说这个新的对象不会对已有描述符的数目进行递增。在上面的代码示例中,FileDescriptorManager类负责管理文件描述符和引用计数,而File类则是对FileDescriptorManager的封装,提供了更易于使用的接口。当多个File对象共享同一个文件描述符时,需要特别注意文件描述符的关闭时机。
2024-08-16 14:29:16
705
原创 C++并发编程实战 读书笔记--线程管理
在t1线程中,data是一个引用类型的参数,通过使用std::ref函数将其包装为一个std::reference_wrapper对象,然后将该对象作为参数传递给线程。这是因为线程的参数是通过值传递的,而不是通过引用传递的。通过使用std::ref,可以将引用类型的参数正确地传递给线程,以便在线程中对其进行修改。总结起来,使用std::ref来传递引用类型的参数,而对于其他类型的参数,可以直接传递给线程。在给定的代码中,t1线程的参数data是一个引用类型,而t2线程的参数buffer是一个字符数组。
2023-08-31 19:14:30
120
原创 C++ 表驱动代码初探(一)
回过头来,我们再细看下上面的代码,上面的test函数代码,主要是处理了字符串和处理函数之间的关系,根据映射的不同字符串调用不同的处理函数,那么我们如果重新设计并处理下这两者之间的关系,是不是就可以优化下了,对于这类代码,我首先会想到用 表驱动的思想实现,至于什么是 表驱动设计思想,大家可以自行去网上找资料看看,这是一个比较经典的设计思想。这段代码,逻辑功能上没啥太大问题,但是多看几遍就会感觉怪怪的,下面的连续if 调用形式几乎是一模一样的,是否可以想办法进行优化下呢?当然,上面的代码也可以用模板进行优化。
2023-07-15 15:38:17
264
1
原创 Linux 常见并发问题
根据 Lu 等人,更正式的违反原子性的定义是:“违反了多次内存访问中预期的可串行性(即代码段本意是原子的,但在执行中并没有强制实现原子性)”。总的来说,对于违反顺序缺陷的问题,我们可以设计的让他们有序,在充分了解当前业务的基础上,合理的设计业务的启动和运行时序,保证可控,比如用条件变量、信号量等。**总结:**违反原子性 也就是通常所说的破坏了事物的原子性导致操作是非原子的,更简单通俗点说,由于临界区的读写不一致导致不可预知的结果。最近在看《操作系统导论》,觉得里面的并发相关的内容写的很好,故此总结下。
2023-07-12 19:23:03
247
1
原创 C语言实现双链表插入节点
因为是在A节点之后插入新节点,所以,A节点的信息是已知的且目前不会变化的,那么我们可以先处理"未知的"B节点和C节点的关系。实现B节点和C节点的连接关系,就是实现将C节点的后向域指向B节点,将B节点的前向域指向C节点,如图中step1和step2所示。这就是我们前面所说的先处理B节点和C节点的关系,因为无论step1和step2如何变化,我们都能准确无误通过A的后向域找到B节点。在没有准备插入节点之前,A 和B 节点的关系如图中1,2线条所示,A节点的后向域指向B节点,B节点的前向域指向A节点。
2023-07-03 20:27:50
343
1
原创 Linux 下C语言实现生产者、消费者模型
1)最好用2个条件变量实现,一个用于生产者,一个用于消费者,避免只用一个条件变量时且多个消费者时,消费者会唤醒消费者;4)wait的时候会临时释放掉锁,待条件满足被唤醒后会该线程会重新持有锁,所以wait的参数要传锁下去;3)条件变量前的条件判断需要用while,不能用if,避免虚假唤醒;2)需要加锁,尤其是在调用signal时要持有锁;
2023-06-29 18:58:06
648
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅