#include <mutex>
时间: 2023-09-19 12:09:53 浏览: 119
`<mutex>` 是 C++11 标准库中提供的一个多线程同步头文件,用于提供互斥量(mutex)、条件变量(condition_variable)、递归互斥量(recursive_mutex)等多线程同步机制。
互斥量(mutex)是一种用于保护共享资源不被多个线程同时访问的机制。当一个线程需要访问共享资源时,它必须先获得该资源的互斥量,如果该互斥量已经被其他线程占用,则该线程会被阻塞等待该互斥量被释放。
条件变量(condition_variable)是一种用于线程间通信的机制。当一个线程需要等待某个条件满足时,它可以调用 `wait()` 方法阻塞自己,并且会释放该条件变量的互斥量,以允许其他线程访问共享资源。当满足条件时,其他线程可以调用 `notify_one()` 或 `notify_all()` 方法通知等待线程继续执行。
递归互斥量(recursive_mutex)与互斥量类似,但允许同一线程多次获得该互斥量,避免死锁的发生。
相关问题
#include <mutex> #include <thread> #include <iostream> struct Box { explicit Box(int num) :
`#include <mutex>`、`<thread>` 和 `<iostream>` 这些头文件在 C++ 中用于处理线程相关的功能。`std::mutex` 是互斥锁,它用于同步对共享资源的访问,防止多个线程同时修改数据导致的竞态条件。
`struct Box` 定义了一个名为 Box 的结构体,它有一个构造函数 `explicit Box(int num)`,接受一个整数参数 `num`。这里的 "explicit" 关键字是可选的,表示这个构造函数不允许隐式转换,通常用于避免意外创建对象。
当你需要在多线程环境中使用这个结构体时,可能会用到线程安全的操作。例如,如果你有多个线程试图同时读写 Box 对象的状态,你可以使用 `std::mutex` 来保护关键部分的代码,确保它们按照正确的顺序执行:
```cpp
Box box(0);
std::mutex mtx; // 创建一个互斥锁
void thread_function() {
std::lock_guard<std::mutex> lock(mtx); // 获取锁
// 线程安全地更新 box,如 box.num++
}
// 在主程序中启动多个线程
std::thread threads[5];
for (int i = 0; i < 5; ++i)
threads[i] = std::thread(thread_function);
// 等待所有线程完成
for (auto& t : threads)
t.join();
#include <vector> #include <queue> #include <thread> #include <mutex> #include <condition_variable> #include <functional> #include <future> class ThreadPool { public: ThreadPool(size_t threads) : stop(false) { for (size_t i = 0; i < threads; ++i) { workers.emplace_back([this] { for (;;) { std::function<void()> task; { std::unique_lock<std::mutex> lock(this->queue_mutex); this->condition.wait(lock, [this] { return this->stop || !this->tasks.empty(); }); if (this->stop && this->tasks.empty()) return; task = std::move(this->tasks.front()); this->tasks.pop(); } task(); } }); } } ~ThreadPool() { { std::unique_lock<std::mutex> lock(queue_mutex); stop = true; } condition.notify_all(); for (std::thread &worker : workers) worker.join(); } template<class F, class... Args> auto enqueue(F&& f, Args&&... args) -> std::future<typename std::result_of<F(Args...)>::type> { using return_type = typename std::result_of<F(Args...)>::type; auto task = std::make_shared<std::packaged_task<return_type()>>(std::bind(std::forward<F>(f), std::forward<Args>(args)...)); std::future<return_type> res = task->get_future(); { std_lock<std::mutex> lock(queue_mutex); if (stop) throw std::runtime_error("enqueue on stopped ThreadPool"); tasks.emplace([task] { (*task)(); }); } condition.notify_one(); return res; } private: std::vector<std::thread> workers; std::queue<std::function<void()>> tasks; std::mutex queue_mutex; std::condition_variable condition; bool stop; };
这是一个 C++ 实现的线程池类。它可以在创建时指定线程数,然后通过 `enqueue` 方法将任务提交到线程池中执行。线程池会自动创建多个线程来执行任务,并且可以动态调整线程池大小,以适应任务负载的变化。这个实现使用了 C++11 中的标准库,包括 `std::thread`、`std::mutex`、`std::condition_variable` 等。它还提供了一个 `std::future` 对象,可以用来获取任务执行的结果。
阅读全文