当一个库声称自己“不是线程安全的”(not thread-safe),意思是它在多线程环境下使用时,可能会出现数据竞争(data race)、未定义行为(undefined behavior)或不一致的结果。线程安全(thread-safety)是指一个库或数据结构在多个线程同时访问时,能够保证正确性和一致性,而无需用户额外添加同步机制(如锁)。
例如:
- C++ 的 std::cout(标准输出流)不是线程安全的。如果多个线程同时调用 std::cout << “Hello” << std::endl,输出可能会交错(如 HHelo),因为没有锁保护内部缓冲区。
线程安全意味着:
求解器 gurobi 与 cplex 都不是线程安全的,意味着不容易对他们使用并行计算(每个线程都要独立创建环境和模型)。
- 线程安全通常需要同步机制(如互斥锁
mutex、原子操作等),这些机制会增加性能开销。许多库为了追求最高性能,选择不内置线程安全支持,而是将同步责任交给用户。 - 我发现对于递归函数应用并行计算,相对于串行计算,没啥优势
非线程安全的常见表现: