1、线程的构造与启动
在C++中,多线程有关的头文件为<thread>
,我们可以使用std::thread类来创建和管理线程。下面是一个简单的示例代码:
cpp
#include <iostream>
#include <thread> // 包含线程库相关头文件
void thread_function() {
std::cout << "Hello from the new thread!" << std::endl;
}
int main() {
// 创建一个新线程并执行函数 thread_function
std::thread t(thread_function);
// 等待线程执行完成
t.join();
return 0;
}
在这个示例中,我们首先包含了头文件,以便我们可以使用std::thread类。然后,我们定义了一个名为print_hello的函数,这个函数将在新线程中执行。在main函数中,我们创建了一个名为t的新线程,并将print_hello函数作为参数传递给它。这将导致print_hello函数在新线程中执行。最后,我们调用了t.join()方法来等待线程完成。这是一个阻塞调用,意味着主线程将等待新线程完成后再继续执行。如果不调用join()方法,新线程将成为分离状态,这意味着当主线程结束时,新线程可能会继续运行。
2、线程的终止与析构
线程的终止和析构主要涉及到两个概念:线程的结束和线程对象的销毁。
线程的结束 :当线程的任务函数返回时,线程就会自动结束。如果需要在主线程中结束一个子线程,可以使用std::thread类的join()或detach()方法。join()方法会阻塞当前线程,直到被调用join()的线程结束。detach()方法则会将子线程设置为后台运行,主线程不会等待其结束。
线程对象的销毁:当一个std::thread对象被销毁时,如果该对象关联的线程仍在运行,程序会调用std::terminate()函数,导致程序异常终止。因此,需要确保在销毁std::thread对象之前,已经正确地结束了线程。
cpp
#include <iostream>
#include <thread>
void thread_task() {
for (int i = 0; i < 5; ++i) {
std::cout << "Thread task running: " << i << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
int main() {
// 创建一个线程对象t,关联到thread_task函数
std::thread t(thread_task);
// 等待线程t结束
t.join();
// 销毁线程对象t
// 如果线程t还在运行,程序会调用std::terminate()函数,导致程序异常终止
// 所以在实际使用中,需要确保在销毁std::thread对象之前,已经正确地结束了线程
return 0;
}
3、std::thread::join
与std::thread::detach
std::thread::join
:这个方法会阻塞当前线程,直到被调用的线程执行完毕。如果一个线程已经被join或者detach,再次调用这两个方法会导致程序终止。
std::thread::detach
:这个方法将线程设置为"分离"状态,这意味着主线程不会等待这个线程结束。一旦线程结束,系统会自动回收其资源。
std::thread::join
代码示例
cpp
#include <iostream>
#include <thread>
void threadFunction() {
std::cout << "Hello from thread!\n";
}
int main() {
// 创建一个新线程
std::thread t(threadFunction);
// 使用join方法等待线程结束
t.join();
// 输出消息表示主线程继续执行
std::cout << "Hello from main!\n";
return 0;
}
std::thread::detach
方法代码示例
cpp
#include <iostream>
#include <thread>
void threadFunction() {
std::cout << "Hello from thread!\n";
}
int main() {
// 创建一个新线程
std::thread t(threadFunction);
// 使用detach方法使线程在后台运行
t.detach();
// 输出消息表示主线程继续执行
std::cout << "Hello from main!\n";
return 0;
}
4、std::this_thread与当前线程操作
std::this_thread
是C++标准库中的一个命名空间,它提供了一些与当前线程操作相关的函数和类。通过使用std::this_thread
,我们可以获取当前线程的ID、设置线程名称、休眠线程等。下面是一个简单的示例代码,演示了如何使用std::this_thread来获取当前线程的ID和设置线程名称
cpp
#include <iostream>
#include <thread>
#include <chrono>
void threadFunction() {
// 获取当前线程的ID
std::thread::id thisThreadId = std::this_thread::get_id();
std::cout << "Current thread ID: " << thisThreadId << std::endl;
// 设置当前线程的名称
std::this_thread::sleep_for(std::chrono::seconds(1)); // 休眠1秒,确保线程名称设置成功
std::this_thread::set_name("MyThread");
// 再次获取当前线程的ID
thisThreadId = std::this_thread::get_id();
std::cout << "Current thread ID after setting name: " << thisThreadId << std::endl;
}
int main() {
// 创建一个新线程并执行threadFunction函数
std::thread myThread(threadFunction);
// 等待新线程执行完毕
myThread.join();
return 0;
}