📜  核心数量 c++ (1)

📅  最后修改于: 2023-12-03 15:40:27.706000             🧑  作者: Mango

核心数量 C++

简介

核心数量(也叫CPU核心数)是指一个处理器中的物理核心数量。在计算机科学中,多核处理器可以并行执行多个指令,从而提高计算机的性能和效率。

在C++中,可以通过编写多线程程序来充分利用多核处理器。多线程编程可以在单个CPU核心上执行不同的指令,并在多个CPU核心之间自动地分配工作负载。

获取核心数量

C++的标准库提供了一个名为std::thread::hardware_concurrency()的函数,用于返回系统上可用的CPU核心数量。下面是一个获取核心数量并输出的示例代码:

#include <iostream>
#include <thread>
 
int main() 
{
    unsigned int n = std::thread::hardware_concurrency();
    std::cout << "Number of cores available: " << n << std::endl;
    return 0;
}

上述代码将输出类似于以下内容的信息:

Number of cores available: 4
多线程编程

在多线程编程中,可以使用C++标准库中的std::thread类来创建线程。std::thread类的构造函数接受一个可调用对象,并在新线程中执行该对象。

下面是一个简单的示例代码,该代码创建了两个线程,并在每个线程中输出一段文本:

#include <iostream>
#include <thread>
 
void thread_function1()
{
    std::cout << "Thread 1 is running." << std::endl;
}
 
void thread_function2()
{
    std::cout << "Thread 2 is running." << std::endl;
}
 
int main() 
{
    std::thread t1(thread_function1);
    std::thread t2(thread_function2);
 
    t1.join();
    t2.join();
 
    return 0;
}

在上述代码中,t1t2是两个std::thread对象,它们分别执行thread_function1thread_function2函数。join函数用于等待线程执行完成。

线程池

线程池是一种常见的用于并发编程的技术。线程池中包含多个线程,这些线程在工作队列为空时等待新的工作任务。当一个任务被提交到线程池中时,线程池从等待队列中选择一个线程来处理该任务。

C++标准库中没有提供线程池,但是可以使用第三方库,如Boost和Qt,来实现线程池。下面是一个使用Boost线程池的示例代码:

#include <iostream>
#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
#include <boost/thread/mutex.hpp>
#include <queue>
 
boost::mutex mutex;
std::queue<int> tasks;
 
void worker_thread()
{
    while (true)
    {
        int task;
        {
            boost::lock_guard<boost::mutex> lock(mutex);
            if (tasks.empty())
                return;
            task = tasks.front();
            tasks.pop();
        }
        // process task...
        std::cout << "Task " << task << " is being processed by thread " << boost::this_thread::get_id() << std::endl;
    }
}
 
int main() 
{
    for (int i = 0; i < 20; i++)
        tasks.push(i);
 
    const int thread_count = std::thread::hardware_concurrency();
    boost::thread_group worker_threads;
    for(int i = 0; i < thread_count; ++i)
        worker_threads.create_thread(worker_thread);
    worker_threads.join_all();
 
    return 0;
}

上述代码实现了一个使用Boost线程池的示例。在其中,worker_thread函数代表一个线程,作为线程池的工作线程。tasks变量表示工作队列,其中存储了一些任务。main函数首先将一些任务添加到工作队列中,然后创建了数个线程并等待它们完成。在每个线程中,通过不停地从工作队列中获取任务并处理来模拟线程池的工作过程。

总结

核心数量是计算机性能的关键因素之一。C++中可以通过多线程编程来充分利用多核处理器,以提高程序的性能和效率。同时,线程池是一种常见的用于并发编程的技术,可以通过第三方库来实现。