littlebot
Published on 2025-04-02 / 3 Visits
0

【源码】基于C语言的并发同步库

项目简介

nsync是一个C语言库,可提供各类同步原语,例如锁、条件变量、一次性初始化、可等待计数器和可等待位等。此库并非谷歌官方产品,但有良好的可移植性,能在类Unix系统和Windows上使用,还可在仅支持C90编译器的系统上编译(需有可用的原子操作)。相较于pthread原语,nsync在某些方面有优势,也存在特定使用场景与限制。

项目的主要特性和功能

  1. 高效的锁机制:nsync锁为读写锁,效率与互斥锁相当,每个锁和条件变量仅占两个字的空间。
  2. 跨平台兼容性:可在类Unix系统和Windows上使用,且易于移植到其他平台。
  3. 条件临界区:功能与条件变量类似,通常更易用,多数常见情况下速度相当。使用时无需在while循环中“等待”,条件为真时也无需显式唤醒或发信号。但线程常等待与同一锁关联的多个不同错误条件时,速度可能比条件变量慢。
  4. 可取消等待:通过传递给等待调用的对象取消等待,与pthread模型中取消线程的方式不同,适用于多线程计算场景或取消仅影响线程中较大操作子操作的情况。
  5. 支持多种编译方式:可使用传统的make方式编译,也支持用CMake进行构建。

安装使用步骤

已有匹配平台子目录

builds/目录下已有与你平台匹配的子目录(例如,x86_64架构运行Linux系统并使用gcc编译器,可选择“x86_64.linux.gcc”),在该子目录下执行以下命令: - 在类Unix系统中:make depend test,此命令会计算依赖关系、构建库及其测试并运行。 - 在Windows系统中(使用Visual Studio,如“x86_64.win32.msvc”):使用nmake代替make

无匹配平台子目录

若没有合适的子目录,在大多数类Unix系统中可以使用以下命令创建: tools/mkmakefile.sh 可能遇到的问题及解决方法: - 若平台的clock_gettime()在实时库中,需给mkmakefile.sh传递-lrt参数。 - 若clang未被自动识别,可给mkmakefile.sh传递-cc clang参数。 - 若CPU架构有多种变体,可给mkmakefile.sh传递-arch <architecture>参数指定特定字符串。

使用CMake构建

bash $ mkdir out $ cd out/ $ cmake .. $ make $ make install 生成的C库名为libnsync,C++库名为libnsync_cpp。可以使用CMake选项-DNSYNC_ENABLE_TESTS=0禁用测试,使用-DBUILD_SHARED_LIBS=ON构建共享库而非静态库。强烈建议使用CMake版本 >= 3.0。

下载地址

点击下载 【提取码: 4003】【解压密码: www.makuang.net】