背景
随着多核处理器的普及,多线程编程已经成为软件开发中不可或缺的一部分。C++11标准为我们带来了线程库,让我们能够更方便地在C++中实现多线程编程。在这篇博客中,我们将介绍C++线程管控的基本概念和方法,包括向线程函数传递参数,移交线程归属权,运行时选择线程数量和识别线程。
向线程函数传递参数
在C++中,我们可以使用std::thread类来创建线程。当我们创建一个线程时,可以将函数作为参数传递给线程构造函数。此外,我们还可以向这个函数传递参数。这里有一个简单的例子:
#include <iostream>
#include <thread>
void print_sum(int a, int b) {
std::cout << "Sum: " << a + b << std::endl;
}
int main() {
std::thread t(print_sum, 3, 4);
t.join();
return 0;
}
在这个例子中,我们创建了一个名为print_sum的函数,它接受两个整数参数并打印它们的和。然后,我们创建了一个线程t,并将print_sum函数作为参数传递给线程构造函数,同时传递了两个整数参数3和4。最后,我们调用join()函数等待线程执行完成。
移交线程归属权
在C++中,线程对象是可移动的,但不可复制的。这意味着我们可以将一个线程对象的归属权转移给另一个线程对象,但不能创建一个线程对象的副本。这可以通过使用std::move()函数实现。下面是一个例子:
#include <iostream>
#include <thread>
void print_hello() {
std::cout << "Hello, World!" << std::endl;
}
int main() {
std::thread t1(print_hello);
std::thread t2 = std::move(t1);
t2.join();
return 0;
}
在这个例子中,我们创建了一个名为print_hello的函数,它不接受任何参数并打印Hello, World!。然后,我们创建了一个线程t1,并将print_hello函数作为参数传递给线程构造函数。接下来,我们将t1的归属权转移到t2,并调用join()函数等待线程执行完成。
在运行时选择线程数量
有时,我们希望根据程序运行时的环境来选择线程的数量。例如,我们可能希望根据计算机上可用的处理器数量来创建线程。我们可以使用std::thread::hardware_concurrency()函数来查询可用的处理器数量。下面是一个例子:
#include <iostream>
#include <thread>
#include <vector>
void print_hello() {
std::cout << "Hello, World!" << std::endl;
}
int main() {
unsigned int num_threads = std::thread::hardware_concurrency();
std::vector<std::thread> threads;
for (unsigned int i = 0; i < num_threads; ++i) {
threads.push_back(std::thread(print_hello));
}
for (auto& t : threads) {
t.join();
}
return 0;
}
在这个例子中,我们首先查询可用的处理器数量,然后创建一个线程向量。接下来,我们根据处理器数量创建线程,并将它们添加到线程向量中。最后,我们遍历线程向量,调用join()函数等待所有线程执行完成。
识别线程
在多线程编程中,有时我们需要识别正在执行的线程。C++标准库提供了std::this_thread命名空间,其中包含一些有用的函数,如get_id(),用于获取当前线程的唯一标识符。下面是一个例子:
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
void print_thread_id() {
std::unique_lock<std::mutex> lock(mtx);
std::cout << "Thread ID: " << std::this_thread::get_id() << std::endl;
lock.unlock();
}
int main() {
std::vector<std::thread> threads;
for (int i = 0; i < 5; ++i) {
threads.push_back(std::thread(print_thread_id));
}
for (auto& t : threads) {
t.join();
}
return 0;
}
在这个例子中,我们创建了一个名为print_thread_id的函数,它使用std::this_thread::get_id()函数获取当前线程的ID,并打印它。我们还使用了std::mutex和std::unique_lock来确保输出不会发生冲突。然后,我们创建了一个线程向量,并创建了5个线程,将它们添加到线程向量中。最后,我们遍历线程向量,调用join()函数等待所有线程执行完成。
最后
总结一下,在这篇博客中,我们介绍了C++线程管控的基本概念和方法,包括向线程函数传递参数,移交线程归属权,运行时选择线程数量和识别线程。C++11标准库中的线程支持为我们提供了强大的多线程编程能力。通过熟练掌握这些概念和方法,我们可以更好地利用多核处理器,提高程序的性能和响应速度。
标签:std,管控,thread,C++,线程,print,include,函数 From: https://www.cnblogs.com/blizzard8204/p/17536951.html