项目简介
nsync是一个C语言库,可提供各类同步原语,例如锁、条件变量、一次性初始化、可等待计数器和可等待位等。此库并非谷歌官方产品,但有良好的可移植性,能在类Unix系统和Windows上使用,还可在仅支持C90编译器的系统上编译(需有可用的原子操作)。相较于pthread原语,nsync在某些方面有优势,也存在特定使用场景与限制。
项目的主要特性和功能
- 高效的锁机制:nsync锁为读写锁,效率与互斥锁相当,每个锁和条件变量仅占两个字的空间。
- 跨平台兼容性:可在类Unix系统和Windows上使用,且易于移植到其他平台。
- 条件临界区:功能与条件变量类似,通常更易用,多数常见情况下速度相当。使用时无需在while循环中“等待”,条件为真时也无需显式唤醒或发信号。但线程常等待与同一锁关联的多个不同错误条件时,速度可能比条件变量慢。
- 可取消等待:通过传递给等待调用的对象取消等待,与pthread模型中取消线程的方式不同,适用于多线程计算场景或取消仅影响线程中较大操作子操作的情况。
- 支持多种编译方式:可使用传统的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】