# ConcurrencyLib **Repository Path**: zyh-eric/concurrency-lib ## Basic Information - **Project Name**: ConcurrencyLib - **Description**: multi-thread programming - **Primary Language**: C++ - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-11-07 - **Last Updated**: 2023-11-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ConcurrencyLib multi-thread programming ## 1. `ThreadSafeStack` 这是一个对`std::stack`的包装,使用`mutex`以保障线程安全。 ### 思考 #### 1. `pimpl` 最初想通过`pimpl`实现,但是由于是模板类的定义在声明处必须完全可见,一旦对模板类添加嵌套类,嵌套类必须在模板类内部实现,这样一来,`pimpl`失去了编译防火墙的作用, 变得毫无意义。 一种解决方案是将模板类与类型无关的代码剥离出来,作为`base`类,之后在`base`类使用`pimpl`。但是`ThreadSafeStack`只是包装`stack`,`stack`需要依赖模板类型参数,所以此处无法剥离`base`类。只能以后在别的地方实践这种方法咯,参见[1.cppreference](https://zh.cppreference.com/w/cpp/language/pimpl); [2.cpp core guideline T.84](https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#t84-use-a-non-template-core-implementation-to-provide-an-abi-stable-interface) #### 2. `CMake Error: Cannot determine link language for target` 我尝试将我的`ThreadSafeStack`编译成一个库,我使用如下语句: ```cmake add_library(tsstack include/ThreadSafeStack.hpp) ``` 得到了报错`Cannot determine link language for target `. 这是因为`cmake`无法将头文件单独编译成库,必须和`.cpp`文件一起(如`file.cpp`)编译。事实上,单独的头文件无需编译成库调用,直接`include`头文件调用即可。 ## 2. `ThreadSafeQueue` 这是一个对`std::queue`的包装,使用`mutex`以保障线程安全,并使用`condition_variable`实现了`waitAndPop`(阻塞当前线程直到队列中有数据可取)。 因为删除了拷贝赋值函数,同时也抑制了自动生成的移动赋值和移动构造函数,后面考虑添加以支持移动语义。