0%

函数式编程(Functional Programming)是一种将计算当成数学函数,并避免数据可变状态的编程范式(Programming Paradigm)。C++是一门多范式语言(Multi-paradigm)所以也对FP有一定程度的支持。本文将简述一些C++中FP的常见写法。

lambda表达式

C++11开始引入了lambda表达式:支持代码中使用使用匿名函数。本着FP中函数也是一等公民的原则,匿名函数也可以成为函数参数、被传递或者被返回。

常见的std::for_each写法:

std::vector<int> numbers = {1, 2, 3, 4, 5};
std::for_each(numbers.begin(), numbers.end(), [](int num) {
std::cout << num * 2 << " ";
});

std::function

在C中传递函数往往需要声明函数指针,函数指针一般用于在异步场景中被注册为回调函数。C++中可以使用一种通用的多态函数封装结构std::function来存储、拷贝、调用一个可被调用的结构 (lambda, 函数指针, 或函数)。使用函数式相关的功能往往需要引入<functional>头文件。例:

阅读全文 »

C++中的锁

互斥锁

mutex(mutual exclusion)是C++中一种用于保证资源在某一时刻只有一个线程访问的同步原语(synchronization primitive)。这用于避免竞态条件(race conditions)并保证共享数据的线程安全访问。

一个最基本的使用互斥锁std::mutex进行线程互斥访问的例子:

  1. 引入相关头文件
    #include <iostream>
    #include <thread>
    #include <mutex>
  2. 定义互斥锁,用于保障共享资源的互斥访问
    std::mutex mtx;
    int shared_counter = 0; // Shared data
  3. 定义函数incrementCounter多次增加共享资源计数
    void incrementCounter(int times) {
    for (int i = 0; i < times; i++) {
    mtx.lock(); // Acquire the lock
    shared_counter++; // Safely access the shared data
    mtx.unlock(); // Release the lock
    std::this_thread::sleep_for(std::chrono::milliseconds(1)); // Sleep for a while (optional)
    }
    }
阅读全文 »

创建NFS服务

NFS(Network File System)用于Linux文件系统的跨网络文件共享。在Linux上搭建NFS服务的步骤如下:

  1. 安装NFS服务相关包
    如果系统是Debian系(Ubuntu、Raspian):

    sudo apt-get update
    sudo apt-get install nfs-kernel-server

    如果系统三CentOS/RHEL/Fedora之类使用yum作为包关系器:

    sudo yum install nfs-utils
  2. 配置共享目录
    创建你想通过NFS共享的目录。例如,共享的目录为~/shared_folder
    修改/etc/exports文件配置NFS共享路径:

    sudo vim /etc/exports

    为每一个需要共享的目录分别添加对应的配置条目,格式如下:

    /directory/to/share client_IP(options)

    例如,~/shared_folder目录以IP ‘192.168.1.100’共享并给它配置读写权限(Read-Write)

    /home/username/shared_folder 192.168.1.100(rw,sync,no_root_squash,no_subtree_check)
阅读全文 »

最近遇到一个业务上修改Windows系统时间导致程序“卡住”的问题,经定位是std::this_thread::sleep_for函数阻塞线程时间长于预期。例如将系统时间往后调一小时,原本阻塞一秒的std::this_thread::sleep_for居然阻塞了一小时之久。查阅相关资料发现是std::this_thread::sleep_for的实现依赖于系统时间,如果系统时间修改则其行为不符合预期。

问了ChatGPT解决方案,它的回答是:

在C++中,sleep函数是用于暂停程序执行指定时间的。当系统时间被修改时,和sleep相关的函数例如std::this_thread::sleep_forstd::this_thread::sleep_util可能会表现出异常行为,因为它通常依赖于系统时钟。为了规避这个问题,你可以使用std::chrono库中的高精度时钟(std::chrono::steady_clock)来实现延时操作,因为它不受系统时间修改的影响。

以下是使用std::this_thread::sleep_forstd::chrono::steady_clock实现稳定延时的示例代码:

阅读全文 »

Windows捕获Crash

打开regedit.exe在注册表中找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting
项,新建3个“字符串值”:配置DumpCount = 10DumpFolder = C:\XUranusDumpDumpType = 2如图所示:

其中DumpType代表的含义是:

  • 0 :Create a Custom Dump
  • 1 :Mini Dump
  • 2 :Full Dump

这里配置将会在程序崩溃时在C:\XUranusDump目录下生成完整的Dump信息,最多生成10个。生成的Dump信息以*.dmp文件形式存在:

阅读全文 »