0%

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文件形式存在:

阅读全文 »

本文将介绍Windows文件系统中安全描述符(Security Descriptor)

Security Desciptor与Linux ACL

Windows安全描述符和Linux ACL(访问控制列表)都是操作系统用于管理文件和目录权限的机制。尽管它们的目的相似,但它们的实现和功能有所不同。以下是 Windows安全描述符和Linux ACL之间的一些主要区别:

  • 操作系统:Windows安全描述符用于Microsoft Windows操作系统,而Linux ACL用于基于Linux的操作系统。
  • 数据结构:Windows安全描述符使用一个复杂的数据结构,包括安全标识符(SID)、访问控制列表(ACL)和一组其他属性。Linux ACL由一系列的访问控制项(ACE)组成,每个ACE都包含一个标识符(用户或组)、权限和权限类型。
  • 继承:Windows安全描述符可以支持多层次的权限继承,文件和目录可以从父目录继承权限。Linux ACL也支持继承,但实现方式略有不同,使用默认ACL来定义新文件和目录的权限。
  • 权限管理:Windows安全描述符提供了详细的权限管理,包括读取、写入、执行、删除等多种操作。Linux ACL也提供了类似的权限管理,包括读取、写入和执行(rwx),但相对来说较为简单。
  • 权限类型:Windows安全描述符包括两种类型的 ACL,即访问控制列表(DACL)和系统访问控制列表(SACL)。DACL用于控制文件和目录的访问权限,而 SACL用于记录对象的访问事件。Linux ACL只提供一种 ACL类型,用于控制访问权限。
  • 用户和组:Windows和Linux都使用用户和组来管理权限,但它们的实现方式不同。Windows使用安全标识符(SID)来表示用户和组,而Linux使用用户 ID(UID)和组 ID(GID)。
  • 工具和命令:Windows和Linux使用不同的工具和命令来管理文件和目录的权限。Windows中常用的工具包括图形界面和命令行工具,如“icacls”和“cacls”。在Linux系统中,可以使用命令如“chmod”、“chown”和“setfacl”等来管理权限。

尽管 Windows安全描述符和Linux ACL在实现和功能上有所不同,但它们的核心目标是相同的,即为操作系统提供一种灵活、安全的权限管理机制。

阅读全文 »