当前位置: 首页> 娱乐> 明星 > 【绝对有用】c++线程池相关技术点二

【绝对有用】c++线程池相关技术点二

时间:2025/7/14 0:52:01来源:https://blog.csdn.net/qq_43552933/article/details/139773908 浏览次数:1次

这行代码是C++多线程编程中的一种常见用法,具体地,它使用std::thread创建一个新的线程,并将该线程加入到一个std::vectorstd::thread容器中。下面是对这行代码的详细解释:

  1. threads:这是一个std::vectorstd::thread类型的容器,用于存储所有创建的线程。
  2. emplace_back:这是std::vector类的一个成员函数,用于在容器的末尾添加一个新的元素。与push_back不同,emplace_back直接在容器的存储位置上构造元素,避免了不必要的拷贝或移动操作,效率更高。
  3. std::thread:这是C++标准库提供的线程类,用于创建和管理线程。
  4. ThreadPool::threadFunction:这是一个指向成员函数的指针,表示要在线程中执行的函数。假设这个函数属于ThreadPool类。
  5. this:这是一个指向当前对象的指针,表示将当前ThreadPool对象的实例传递给threadFunction成员函数,以便该函数在执行时能够访问当前对象的成员变量和成员函数。
    综合起来,这行代码的意思是:创建一个新线程,该线程执行ThreadPool类的threadFunction成员函数,并将当前对象的指针作为参数传递给该函数。然后,将新创建的线程加入到threads向量中进行管理。

下面是一个简化的示例,演示了如何使用这行代码:

#include
#include
#include

class ThreadPool {
public:
ThreadPool() {
// 创建多个线程,每个线程执行threadFunction成员函数
for (int i = 0; i < 4; ++i) {
threads.emplace_back(&ThreadPool::threadFunction, this);
}
}

~ThreadPool() {// 等待所有线程完成for (auto& thread : threads) {if (thread.joinable()) {thread.join();}}
}void threadFunction() {std::cout << "Thread ID: " << std::this_thread::get_id() << std::endl;
}

private:
std::vectorstd::thread threads;
};

int main() {
ThreadPool pool;
return 0;
}
在这个示例中,ThreadPool类的构造函数创建了四个线程,每个线程执行threadFunction函数,并输出其线程ID。程序运行时,会创建四个线程,并输出相应的线程ID。


这行代码是C++多线程编程中条件变量(std::condition_variable)的一个常见用法。它用于线程同步,确保线程在满足特定条件之前处于等待状态。下面是对这行代码的详细解释:

  1. condition.wait(lock, predicate)
    • condition 是一个 std::condition_variable 对象,用于线程间的等待和通知机制。
    • wait 是 std::condition_variable 类的一个成员函数,使当前线程等待,直到收到通知或满足给定的条件。
    • lock 是一个 std::unique_lockstd::mutex 对象,用于管理互斥锁的所有权。
    • predicate 是一个 lambda 表达式或函数对象,用于判断条件是否满足。
  2. lock
    • 这是一个 std::unique_lockstd::mutex 对象,用于在等待期间自动管理互斥锁的上锁和解锁。
    • 在 wait 调用之前,lock 应该已经上锁。在 wait 期间,互斥锁会被解锁,以允许其他线程访问共享资源。
    • 当 wait 返回时,互斥锁会重新上锁,以保护共享资源。
  3. this { return !taskQueue.empty() || terminate; }
    • 这是一个 lambda 表达式,作为 wait 函数的谓词(predicate)。
    • 它捕获了当前对象的 this 指针,允许访问类的成员变量。
    • return !taskQueue.empty() || terminate; 是谓词的逻辑,当 taskQueue 非空或 terminate 为 true 时,返回 true,否则返回 false。
    综合起来,这行代码的意思是:当前线程等待,直到 taskQueue 非空或 terminate 为 true。在等待期间,互斥锁被解锁,以允许其他线程操作 taskQueue。当 taskQueue 非空或 terminate 为 true 时,线程会继续执行,并且互斥锁会重新上锁。

这是一个典型的生产者-消费者模型的实现,其中 taskQueue 是任务队列,terminate 是一个标志,指示线程是否应该终止。

下面是一个简化的示例,演示了如何使用这行代码:

#include
#include
#include
#include
#include <condition_variable>
#include

class ThreadPool {
public:
ThreadPool(size_t numThreads) : terminate(false) {
for (size_t i = 0; i < numThreads; ++i) {
threads.emplace_back(&ThreadPool::worker, this);
}
}

~ThreadPool() {{std::unique_lock<std::mutex> lock(mutex);terminate = true;}condition.notify_all();for (std::thread& thread : threads) {if (thread.joinable()) {thread.join();}}
}void enqueueTask(std::function<void()> task) {{std::unique_lock<std::mutex> lock(mutex);taskQueue.push(task);}condition.notify_one();
}

private:
void worker() {
while (true) {
std::function<void()> task;
{
std::unique_lockstd::mutex lock(mutex);
condition.wait(lock, this { return !taskQueue.empty() || terminate; });
if (terminate && taskQueue.empty()) {
return;
}
task = taskQueue.front();
taskQueue.pop();
}
task();
}
}

std::vector<std::thread> threads;
std::queue<std::function<void()>> taskQueue;
std::mutex mutex;
std::condition_variable condition;
bool terminate;

};

int main() {
ThreadPool pool(4);

pool.enqueueTask([] { std::cout << "Task 1 executed\n"; });
pool.enqueueTask([] { std::cout << "Task 2 executed\n"; });
pool.enqueueTask([] { std::cout << "Task 3 executed\n"; });
pool.enqueueTask([] { std::cout << "Task 4 executed\n"; });std::this_thread::sleep_for(std::chrono::seconds(2));return 0;

}
在这个示例中,ThreadPool 类创建了一个包含四个线程的线程池。每个线程在等待 taskQueue 中有任务时会处于等待状态。当有新任务加入队列时,线程会被唤醒并执行任务。程序在主线程中添加了四个任务,并让线程池处理这些任务。


关键字:【绝对有用】c++线程池相关技术点二

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: