在现代 C++ 中,线程支持是通过 <thread>
头文件提供的,它允许程序同时执行多个任务。了解线程的生命周期与控制对于编写高效、并发的程序至关重要。
1. 线程的生命周期
线程的生命周期主要包括以下几个阶段:
- 创建:线程对象的实例化。
- 运行:执行线程内的任务。
- 等待:等待线程完成,通常是通过
join
或 detach
。
- 销毁:线程结束后,资源被释放。
1.1 创建线程
在 C++ 中,创建线程的常见方法是使用 std::thread
类。以下是一个创建线程的简单示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include <iostream> #include <thread>
void threadFunction() { std::cout << "线程正在运行..." << std::endl; }
int main() { std::thread t(threadFunction);
if (t.joinable()) { t.join(); }
return 0; }
|
在这个示例中,std::thread t(threadFunction);
创建了一个新的线程,该线程将执行 threadFunction
函数。
1.2 线程运行
一旦线程被创建,它将开始执行分配给它的任务。std::thread
将在其构造函数中启动线程。线程一旦开始运行,程序将继续执行主线程中的代码,直到调用 join()
或 detach()
。
1.3 等待与控制
当一个线程完成其工作时,主线程可以通过以下两种方法之一来进行控制:
1.3.1 Join
join()
用于等待线程完成执行。调用 join()
的线程会阻塞,直到目标线程结束。
1 2
| std::thread t(threadFunction); t.join();
|
1.3.2 Detach
detach()
将线程分离,使其在后台运行。分离后,主线程不会等待该线程完成,但要小心使用,因为一旦线程分离,无法再调用 join()
。
1 2
| std::thread t(threadFunction); t.detach();
|
1.4 线程销毁
当线程结束时,它会自动释放其内部资源。如果线程是可连接的(通过 joinable()
),调用 join()
后会回收线程资源。如果使用了 detach()
,线程资源将由系统自动管理。
对线程的生命周期管理非常重要,不当的管理可能会导致资源泄漏或未定义行为。
2. 线程的状态控制
C++ 还提供了以下几种方法来控制线程的状态:
- 检查线程状态:使用
joinable()
方法检查线程是否可连接。
- 使用条件变量:
std::condition_variable
可以用于线程之间的同步,帮助控制线程的执行时机。
- 互斥量:使用
std::mutex
来保护共享数据,避免数据竞争。
2.1 示例:使用条件变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| #include <iostream> #include <thread> #include <mutex> #include <condition_variable> #include <chrono>
std::mutex mtx; std::condition_variable cv; bool ready = false;
void waitForWork() { std::unique_lock<std::mutex> lock(mtx); cv.wait(lock, [] { return ready; }); std::cout << "工作已完成!" << std::endl; }
void doWork() { std::this_thread::sleep_for(std::chrono::seconds(1)); { std::lock_guard<std::mutex> lock(mtx); ready = true; } cv.notify_one(); }
int main() { std::thread worker(waitForWork); std::thread producer(doWork);
worker.join(); producer.join();
return 0; }
|
在这个示例中,我们使用条件变量 cv
来控制线程的执行。waitForWork
线程会等待 doWork
完成其工作并改变 ready
状态。
3. 小结
C++ 线程的生命周期与控制是高效并发编程的核心。掌握以下内容能够帮助你更好地利用线程:
- 创建和销毁线程的过程。
- 管理线程的执行状态(使用
join
和 detach
)。
- 使用
mutex
和 condition_variable
进行线程间的同步。
通过不断实践和完善你的代码,你可以更深入地理解并掌握 C++ 中的线程。