如何在C++中设计并实现一个功能全面的多线程类,包括基本特性如创建线程、同步机制和线程通信
时间: 2024-11-17 15:28:10 浏览: 11
在C++中,设计一个多线程类通常涉及使用标准库中的`<thread>`头文件以及一些并发工具,例如互斥量(mutexes)、条件变量(condition variables)和共享内存。以下是一个基础的多线程类示例,包含了创建线程、同步机制(互斥锁和信号量)和简单线程间通信:
```cpp
#include <iostream>
#include <thread>
#include <vector>
#include <mutex>
#include <condition_variable>
class ThreadManager {
public:
// 创建线程函数模板
template<typename F, typename... Args>
std::thread create_thread(F func, Args... args) {
return std::thread(func, args...);
}
// 使用std::lock_guard保证互斥访问
void safe_access(std::function<void()> action, const std::string& lock_name) {
std::unique_lock<std::mutex> l(mtx[lock_name]);
cv[lock_name].wait(l, [this, &action]() { return should_exit; });
action();
cv[lock_name].notify_one(); // 释放锁以便其他等待的线程继续
}
// 停止所有线程
void stop_all() {
should_exit = true;
for (auto& thread : threads) {
if (!thread.expired()) {
thread->join();
}
}
}
private:
std::vector<std::thread> threads;
std::mutex mtx; // 互斥量
std::condition_variable cv; // 条件变量
bool should_exit = false; // 表示是否应停止所有线程
// 示例:使用信号量限制同时运行的线程数量
int semaphore_count = 5;
// 为每个可能需要同步的区域分配一个互斥量和条件变量
std::map<std::string, std::pair<std::mutex, std::condition_variable>> mutex_map;
};
// 示例线程函数,接收一个字符串参数并输出
void worker(const std::string& msg) {
while (!ThreadManager::should_exit.load()) {
// 使用指定的互斥量进行安全访问
ThreadManager::safe_access([msg](){ std::cout << "Worker: " << msg << '\n'; }, "myLock");
}
}
int main() {
ThreadManager manager;
auto thread1 = manager.create_thread(worker, "Thread 1");
auto thread2 = manager.create_thread(worker, "Thread 2");
// 同步示例 - 限制同时最多5个线程执行
manager.semaphore_count = 5;
manager.safe_access([]{ manager.semaphore_count--; });
// 想要结束时调用stop_all()
manager.stop_all();
return 0;
}
```
在这个例子中,我们定义了一个`ThreadManager`类,它包含创建线程的方法(`create_thread`),使用`std::lock_guard`进行线程安全操作的方法(`safe_access`),以及停止所有线程的功能(`stop_all`)。此外,我们还展示了如何使用互斥量和条件变量进行简单的线程同步。
阅读全文