灵感大王的灵感
文章平均质量分 56
灵感大王的灵感
先天无极编程圣体
眼中揽银河,手可摘星辰
展开
-
让自定义的 Person 类使用 Qt 自带的元对象系统
要让自定义的PersonQObjectQObjectQ_OBJECTQ_OBJECTQ_PROPERTY下面我们来实现一个简单的自定义Person类,并让它使用 Qt 元对象系统。原创 2024-10-06 07:38:42 · 604 阅读 · 0 评论 -
Qt Creator 添加新编译套件(Kits) 的大致流程
添加编译器路径:设置 C 编译器和 C++ 编译器的路径。创建构建套件:创建并配置新的构建套件,指定编译器、调试器和构建工具。指定 C、C++ 编译器和 GDB:确保编译器和调试器配置正确。选择构建套件:在项目中选择配置好的构建套件进行编译和调试。这个流程确保你可以在 Qt Creator 中添加旧版或自定义编译器工具链,并且正确地使用它们编译和调试项目。原创 2024-09-08 18:01:26 · 867 阅读 · 0 评论 -
编译器内建函数(compiler built-in function)之 分支预测提示函数(branch prediction hint function)之 __builtin_expect
使用 __builtin_expect(a, 1) 是告诉cpu 这个逻辑分支 更有可能为真。使用 __builtin_expect(a, 0) 是告诉cpu 这个逻辑分支 更有可能为假。整个逻辑分支 与 __builtin_expect(a, 0) 括号里写0 还是 1 无关。原创 2024-09-08 08:20:12 · 216 阅读 · 0 评论 -
晨读:无论 std::move 的操作数是什么,最终都将转化为 右值引用(T&&) 吗?
std::move将左值转换为右值引用,从而允许移动语义。右值经过std::move后仍然是右值引用,并不会产生任何变化。重要的是,std::move并不会自动执行“移动”操作,它只是标记对象为右值,以便在需要时使用移动语义。真正的“移动”是通过对象的移动构造函数或移动赋值运算符来实现的。这个问题触及了C++中移动语义和右值引用的一些微妙之处。让我们仔细分析一下:std::move 的主要作用:std::move 的主要目的是将其参数转换为右值。原创 2024-09-06 07:16:34 · 296 阅读 · 0 评论 -
详解 设计模式 之 反模式
反模式通常源于对设计模式的误解或滥用。在设计系统时,理解这些反模式有助于开发人员避免常见的陷阱,从而创建更加健壮、可维护的代码。每个反模式都有其对应的解决方案,通过正确的设计原则和实践,可以避免陷入这些反模式。原创 2024-09-03 04:15:27 · 1043 阅读 · 0 评论 -
使用 自旋锁 思想 实现 最小时间 等待
这是一个自旋思想的妙用 确定可以等到那个不为null的结果 面试也一样只要心中坚信有一个不为null的结果就一定可以等到,冲鸭!会启动一个新进程(记事本),但在实际运行过程中,记事本窗口可能还没有完全初始化和显示。win 上 打开一个记事本文件 并ctrl+a 全选内容。4 根据焦点去 ctrl+a。时,可能窗口尚未准备好。原创 2024-08-21 06:53:29 · 115 阅读 · 0 评论 -
Qt中QAction实现互斥效果
点击其中某一个时发现他们不是互斥的 可以同时选中所有 也就是所有的action前面都有对号。也就是加入组 并设置成互斥的 实现了同时只能选中1个的效果。首先 手动创建 3个action。把这三个action拖进去。原创 2024-08-20 07:24:03 · 249 阅读 · 0 评论 -
Qt中QVariant使用小技巧
这里的list应该是一个类型。QVariant可以容纳不同类型的数据,包括整数和字符串。在这部分代码中,整数和字符串被添加到了列表中,这是QVariant的常见用法。这段代码使用C++11的范围基的for循环来遍历列表。每个元素以QVariant的形式被处理,并使用qDebug()函数打印。qDebug()函数配合QVariant可以直接打印存储在QVariant内的数据。原创 2024-08-19 06:34:05 · 300 阅读 · 0 评论 -
从Java到量子计算:我不断“出圈“技术旅程 , 冲鸭 !
再后来懂了一切皆文件 每个命令后面都有一段沉长的程序 命令只是 配置到环境变量的程序启动的提示词。因为我们用的英特尔 和 amd 的处理器属于 x86架构 用x86汇编 可以编程 控制他们。后来学习嵌入式 接触了 带gui 的linux和不带gui的linux。所谓驱动开发就是 给各种不同标准的硬件开发驱动 核心就是各种各样的硬件。也阅读过几本写内核的书 都是以无法理解+走火入魔的形式结束的。我希望随着时间的推移 所有接触硬件的岗位都划为 硬件工程师。原创 2024-08-18 10:57:08 · 468 阅读 · 0 评论 -
Qt中 函数的双返回值逻辑误区
其实Qt中处处有winAPI 处处有C++17语法 把Qt理解为前端是不是太片面了。难道是返回两个值吗 太可怕了 就算我 装到一个容器内返回 但是后续又该如何判断呢。查找 a.txt ==null返回 null ,!=null 返回 一个值。查找 *a.txt ==null返回 null ,!=null 返回 一个值。此时 GPT 登场 他说 可以先判断 a.txt是否为null。如果为null 则代表以备修改为*a.txt。如果被更改且未保存 名字为*a.txt。如果没被更改 则名字为 a.txt。原创 2024-08-18 09:48:09 · 141 阅读 · 0 评论 -
C语言 关于行差和元素地址差的经典示例
这些示例展示了如何通过不同的方式访问二维数组中的元素,解释了行地址与元素地址之间的差异,以及如何通过不同的表示法实现相同的结果。这些技巧在优化 C 语言中的内存操作和理解多维数组的底层机制方面非常有用。原创 2024-01-12 11:29:29 · 463 阅读 · 1 评论 -
C语言 关于递归汉诺塔的通俗理解(仔细斟酌版)
汉诺塔问题是一个经典的递归问题。每次只能移动一个盘子。盘子只能叠在比它大的盘子上。代码通过递归方式解决这个问题,并输出每一步的移动操作。这段代码通过递归实现了汉诺塔问题的求解,逐步将盘子从源塔移动到目标塔,并在每次移动操作时调用move函数输出具体的操作步骤。代码中还使用了递归计数count来记录总的移动次数。原创 2024-01-16 23:45:30 · 518 阅读 · 0 评论 -
C语言 彻底搞懂大小端序
这段代码的主要目的是验证系统的字节序(大端序或小端序)。通过联合体的使用和指针类型转换,代码清晰地展示了在小端序系统中,如何通过直接操作内存来检查数据在内存中的存储顺序。小端序(Little Endian):低字节存储在低地址,高字节存储在高地址。代码运行结果表明当前系统为小端序。大端序(Big Endian):高字节存储在低地址,低字节存储在高地址。代码通过输出结果验证系统是否为大端序。union c1// 此演示必须在联合体下进行// 必须将int char 都声明为unsigned否则有歧义。原创 2024-01-28 00:20:18 · 365 阅读 · 1 评论 -
C语言 字符串去重的经典示例
这是一份不借助任何函数的源码,符合c风格。C标准库中并未提供字符串去重处理函数。原创 2024-02-01 10:28:53 · 600 阅读 · 1 评论 -
C语言 free() 知多少?
所指向内存区域的内容。它仅仅是通知操作系统,这块内存区域现在可以被重新分配。或其他指针访问这块内存,其行为将是未定义的,可能会导致程序崩溃或产生不可预期的结果。所指向的那块内存了,现在系统可以将其回收,以便其他代码可以重新利用这片内存。后,这块内存中的数据可能保持不变,但也有可能会被系统覆盖。并不会因此消失,也不会改变其存储的地址值,也就是。时,你是在告诉系统:你已经不再需要。所指向的内存块,与指针。依然指向原来的内存地址。也不会自动修改或清空。之后,如果你继续通过。原创 2024-02-01 19:30:50 · 447 阅读 · 1 评论 -
C语言 使用realloc()对strtok()动态扩容的跨平台实现
代码展示了如何在 Linux 和 Windows 两种环境下,使用strtok和strtok_s进行字符串分割,并动态管理内存。字符串分割:通过分隔符(和)对字符串进行分割,并保存每个分割后的子字符串。动态内存管理:使用realloc动态调整指针数组的大小,并进行内存分配错误检查。内存安全:在内存分配失败时,避免内存泄漏;操作结束后,释放已分配的内存。这个示例不仅展示了如何处理字符串分割,还体现了在实际编程中如何安全、有效地管理动态内存,这在 C 语言编程中是非常重要的。原创 2024-02-02 14:17:50 · 540 阅读 · 1 评论 -
C语言 使用队列(FIFO)的生产消费模型
这段代码展示了如何使用文件锁定机制来实现生产者模型。在多进程环境中,锁定机制确保了对共享资源(文件)的独占访问,避免了多个进程同时访问同一资源而导致的数据竞争问题。通过将生产的数据写入文件,代码模拟了一个简单的生产者不断向共享资源生产数据的过程。// 消费者模型int main()// 打开同一个文件// 缓冲区清零 方便额外操作// read的返回值,表示真实读到了多少// 创建flock结构体while (1)// 上锁,没获取就一直等,阻塞。原创 2024-02-11 16:41:45 · 477 阅读 · 1 评论 -
C语言 关于execve()是否会继承父进程环境变量的深入讨论
在创建新的子进程时,通常情况下,子进程会继承父进程的环境变量。不过,这种继承并不意味着严格意义上的复制,子进程在其环境中设置或更改的环境变量不会影响父进程的环境变量,反之亦然。函数的初始环境变量仅取决于在参数中是否显式地传递了环境变量,与其他因素无关。当单独运行第二个编译出的程序时,新程序无法找到自定义的环境变量。,执行结果表明新程序无法获取自定义的环境变量。,执行结果表明新程序可以获取自定义的环境变量。以上实验结果充分证明了观点1与观点2的正确性。是传递过来的环境变量集合。为系统默认的环境变量。原创 2024-02-14 11:31:15 · 668 阅读 · 1 评论 -
C语言 创建守护进程的一般流程
这段代码的主要功能是创建一个子进程,并终止父进程,使得子进程可以在没有父进程的情况下继续运行,从而为将子进程设置为守护进程打下基础。这种方法确保了子进程能够在后台长期运行,而不受父进程状态的影响。守护进程是指在后台运行、没有控制终端的进程,通常用于提供长期服务。原创 2024-02-18 10:16:16 · 529 阅读 · 0 评论 -
C语言 linux环境 信号测试 通用代码
模式 1:捕获并处理所有可捕获信号,程序会在信号到达时输出信号编号及其描述。模式 2:不捕获信号,程序只会定期输出当前进程的 PID 和运行状态。这种模式设计的目的是演示信号处理在 Unix/Linux 环境下的工作机制,并展示程序在处理信号与不处理信号时的不同行为。原创 2024-02-21 12:14:06 · 474 阅读 · 0 评论 -
c语言 system v风格 使用共享内存及信号量进程间通信示例
信号处理代码注册了一个信号处理函数,用来捕获SIGALRM信号并打印该信号的描述。这样可以防止进程因收到此信号而终止。共享内存创建与挂载使用shmget创建或获取一个共享内存段,大小为 1024 字节,权限为 0777。共享内存是用于在多个进程之间共享数据的。使用shmat挂载共享内存段到当前进程的地址空间,使得进程能够访问这块共享内存。ipc_stat函数用于打印共享内存的状态信息,包括创建进程的 PID、内存大小和当前的连接数。信号量的创建与操作使用semget。原创 2024-02-25 18:28:14 · 478 阅读 · 1 评论 -
C语言 posix风格 mq_notify的经典示例
消息队列的初始化:程序启动时,创建或打开一个消息队列并初始化相关属性。异步通知注册:程序在启动后立即注册一个异步通知机制,确保当消息队列中有新消息时能够收到SIGUSR1信号。信号处理:当程序收到SIGUSR1信号时,调用处理函数从消息队列中获取消息,并重新注册通知以继续接收消息。当收到SIGINT信号时,程序会执行清理操作并退出。循环运行:程序在主循环中保持运行状态,等待消息的到来和信号的触发。这个程序是一个简单的 POSIX 消息队列生产者,它向指定的消息队列/mq1发送一条带有进程 ID 的消息。原创 2024-03-02 15:29:22 · 665 阅读 · 1 评论 -
C语言 使用fork()函数 父子进程代码执行逻辑的经典示例
这段代码展示了如何使用fork()函数在 Unix/Linux 系统中创建一个子进程,并且解释了在fork()函数调用前后,父进程和子进程如何分别执行各自的代码。fork()的使用fork()是 Unix/Linux 系统中用于创建新进程的基础函数。父进程通过fork()创建一个子进程,子进程继承了父进程的执行上下文,但它有自己独立的 PID。exec*系列函数:这些函数用于替换当前进程的代码段。如果成功调用,这意味着后续代码不会执行,因为当前进程的执行内容已经被替换为新程序。wait()函数。原创 2024-03-06 13:53:57 · 586 阅读 · 1 评论 -
C语言 pthread()异步非阻塞交替打印示例
4 线程回收使用分离非阻塞技术,主进程可以进行自己的逻辑而不必等待线程回收。3 使用信号量和信号保证线程运行结束 主进程再结束。1 演示异步非阻塞交替打印 竞态条件 不上锁。2 演示线程的启动顺序 结束顺序。原创 2024-03-06 23:58:37 · 433 阅读 · 1 评论 -
C语言pthread互斥锁(mutex)和可重入锁(递归锁recursive)的演示
1 一旦共享资源被互斥锁锁定,则其余线程想访问共享资源必须等待,直到锁被释放。使用mutex的属性,开启递归锁(可重入锁),解决同一线程可重入问题。2 使用normal属性的互斥锁,一旦发生重入逻辑,则阻塞,成为死锁。需要将属性改为recursive 成为可重入的,递归的。unix-like操作系统 gnu_c或兼容c库。演示未使用可重入锁对资源的重入访问。演示使用互斥锁后 线程的执行顺序。1 命令行传参 1 model=1。2 命令行传参 2 model=2。3 命令行传参 3 model=3。原创 2024-03-09 17:33:42 · 1337 阅读 · 0 评论 -
C语言真假之争
假(即“非真”或“非零”)原创 2024-03-10 12:27:12 · 688 阅读 · 1 评论 -
C语言pthread读写锁特性展示
在函数threads_20_init()中包括10个线程调用write_f2()函数进行写操作,10个线程调用read_f2()函数进行读操作。一个线程写入的时候,其他线程无论读取还是写入都会被阻塞,而当一个线程在读取的时候,其他线程如果是读取则不会被阻塞,如果是写入则会被阻塞。在write_f2()函数中,线程首先打开或创建文件,“上写锁”,然后将内容写入文件并打印日志,最后“解锁”。在read_f2()函数中,线程首先打开文件,“上读锁”,然后读取文件内容并打印日志,最后“解锁”。原创 2024-03-10 18:33:11 · 372 阅读 · 1 评论 -
C语言演示多线程编程条件下自旋锁和屏障的使用
unix-like系统 或 GNU_C库 或 同等条件 可以在IDE集成环境下也可以编译后在终端单独运行。原创 2024-03-11 18:01:10 · 929 阅读 · 0 评论 -
C语言pthread互斥锁与条件变量应用逻辑的简单示例
4 当线程队列中只有1条处于wait状态的线程,调用pthread_cond_signal,可以将其唤醒。消费者消费后发现仓库为空,将要调用pthread_cond_wait之际,系统调度到生产者线程。3 初始化条件变量后 调用pthread_cond_wait 线程状态为S 睡眠,且释放了互斥锁。5 唤醒后pthread_cond_wait不是立即返回,而是获得互斥锁后才返回。7 使用pthread_cond_broadcast可以唤醒全部等待线程。三秒后,signal释放锁,wait返回成功,全剧终。原创 2024-03-12 17:40:38 · 601 阅读 · 0 评论 -
C语言pthread使用互斥锁及条件变量的跨进程多生产多消费模型
4 对生产者按ctrl+c,生产消费都会清理资源并结束,输出all done。在唤醒后执行检查 只有仓库全满 或 仓库全空 才就继续执行生产消费逻辑。使用pthread的互斥锁和条件变量对共享资源进行保护。该模型同时还提供了一个监控线程 用于观察仓库情况。将此线程间模型 分为两个进程(两个main函数)直到生产满 或 消费空 才使用条件变量通知对方。该模型使用粗粒度锁 将整个生产或消费过程锁住。格局要打开,进程也要打开,看看进程外的世界。使用互斥锁及条件变量的线程间生产消费模型。否则依然是通知对方并等待。原创 2024-03-14 12:48:25 · 1033 阅读 · 0 评论 -
C语言TCP通信基础CS模型
4 客户端进程的结束取决于服务器的处理速度,当服务器send全部数据后会close socket,客户端会收到0个字节后结束进程。服务器:socket->bind->listen->accept->recv->send->close 共7步。3 如果服务器和客户端都使用whlie(recv)的结构会造成类似死锁的现象,所以必须有一端缓冲区足够大。客户端:socket->connect->send->recv->close 共5步。当客户端连接上服务器后,会输出已连接字样,并打印收到的数据。原创 2024-03-22 16:29:58 · 393 阅读 · 0 评论 -
C语言UDP基础CS模型
5 运行路径:客户端发射一条消息->服务器收到消息后回射给客户端一条消息->客户端打印出消息。服务器: socket->bind->recvfrom->sendto->close。4 使用SO_REUSEADDR选项消除了测试环境下服务器短时间内无限重启的顾虑。1 未使用更先进的服务器模型,用基础单线程阻塞(recvfrom)作为演示。客户端: socket->sendto->recvfrom->close。2 服务器使用while循环接收客户端消息。3 适用于同一网段的不同主机间通信。原创 2024-03-23 16:33:04 · 897 阅读 · 0 评论 -
C语言UNIX域套接字CS模型
2 传统udp在首次sendto时系统临时分配端口,在套接字关闭|程序终止|显式解绑时端口生命周期结束,而unix域套接字则需要手动绑定,否则客户端无法收到服务器的回信。3 可以观察到CS两端的完整启动退出流程,为了实现这一目标仅进行一次通信。3 复制文件路径时,sun_path的长度无法更改,容易出现越界的情况。2 实现基于数据报的unix域套接字通信cs模型。1 实现基于流的unix域套接字通信cs模型。1 使用unlink避免地址冲突 清理资源。原创 2024-03-24 10:22:20 · 786 阅读 · 0 评论 -
C语言多服务器多播组网框架
开启操作系统多播广播功能,关闭系统防火墙,使用物理路由还需在路由开启广播多播功能。UDP ipv4 禁止本地回环 允许端口复用 超时等待 限制跳点 Echo。任意endpoint可主动发送多播,也可以收到信息后自动多播。发送端和接收端运行不分先后 可无限复制多个接收端模拟集群。原创 2024-03-25 23:24:42 · 544 阅读 · 0 评论 -
C语言实现广播Echo通信
主要用于带有gnu_c 的unix-like系统 其他系统可能要对代码进行改造。2 服务端设置超时等待10秒 如果没有收到回复 则再次广播。4 客户端收到广播后 处理3秒 echo 服务器一条消息。3 客户端启动后 将永久阻塞等待接听广播。可复制多个客户端 观察现象。5 服务器打印出这条消息。原创 2024-03-26 08:32:34 · 705 阅读 · 0 评论 -
[C语言]带连接数统计功能的多进程TCP服务器
posix风格的信号量不同于system V,开局直接设0,还可以进程间共享,每当一个连接加入就加1,每当一个连接处理完进程退出就减1,用完就关上,重开代码先unlink。2 在子进程中 关闭socket返回的fd,在父进程中关闭accept返回的fd,防止资源泄露及不可预知的风险。每连接一个客户端,计数器加1 ,处理完成计数器减1,但使用什么可以完成这种效果?3 父进程中忽略子进程结束信号,等于自动回收,防止变僵尸。当有了一个主体结构可以运行,如何观察这种并发的效果?1 使用if判断函数的返回值。原创 2024-03-27 22:45:52 · 515 阅读 · 0 评论 -
C语言基于TCP的多线程服务器
为了解决这个问题,最佳做法是为每个接受的连接分配一个新的内存空间来存储它的client_sockfd,并将这块内存的指针传递给新创建的线程。accept()返回的client_sockfd 是否可以直接填入pthread_create()作为创建线程的参数?他会不断地更新client_sockfd的值,而传递给pthread_create()是这个值的地址。我们观察到 while(1)中并没有阻塞的函数,假设accept()的速度足够快。3 手动运行客户端 可以无限次开启观察服务器现象。原创 2024-03-28 09:45:08 · 637 阅读 · 0 评论 -
关于io多路复用select() 读就绪 写就绪 的浅显理解
3 套接字错误:如果在写操作过程中套接字遇到错误(例如,网络断开),套接字也可能被标记为写就绪,以便应用程序可以尝试写操作来获取错误状态。2 连接建立:对于非阻塞的连接操作(如TCP客户端尝试连接服务器),连接成功建立后,套接字会变为写就绪,表示应用程序可以开始发送数据。2 连接请求:对于监听套接字(如TCP服务器监听客户端的连接请求),有新的连接请求到达,应用程序可以调用accept而不会阻塞。1 数据可用:套接字接收缓冲区中有未读数据,即有新的数据到达,应用程序可以执行读操作而不会被阻塞。原创 2024-03-29 00:01:50 · 591 阅读 · 0 评论 -
select中fd_set边缘情况的深入探讨
将int fd =0,int fd =1,int fd =2,加入fd_set则表示 第0,1,2位上存在fd 是标准输入,标准输出和标准错误。也可以将int fd=1023加入fd_set,表示fd_set第1023位上存在fd=1023。则在此之后新建的socket返回的fd将无法被加入到fd_set(超出范围)操作系统分配的文件描述符(fd)是连续的并且是按照从小到大的顺序分配的。但是不能将int fd=1024加入fd_set,这将超出表示范围。设 n = 你想要监控的所有文件描述符中的最大值。原创 2024-03-29 11:18:32 · 362 阅读 · 0 评论 -
C语言TCP服务器模型 : select + 多线程与双循环单线程阻塞服务器的比较
最重要的select判断依据是内核缓存是否有足够空间可写 而不是数据是否准备好。我使用了 接收多路复用+分线程处理数据+处理完毕在线程内直接发送 的模型。但是如果每个连接都要求处理大型数据 则响应时间不确定。什么样的场景收发都适合用select?本来是想接受发送全用select。所以为了数据准备好再send。IO密集型转发服务器。原创 2024-03-31 03:13:08 · 799 阅读 · 1 评论