#include <iostream>
#include <thread>
#include <Windows.h>
//线程处理函数
void Print()
{
//std::this_thread::sleep_for(2000);
Sleep(2000);
std::cout << "子线程运行" << std::endl;
}
int main()
{
//创建线程
std::thread test1(Print);
test1.join();
std::cout << "主线程运行" << std::endl;
system("pause");
}
每天学点C++(C++实例教程:教程+源码)多线程编程.zip
需积分: 0 27 浏览量
更新于2024-06-21
收藏 10.89MB ZIP 举报
在C++编程中,多线程技术是一种强大的工具,它允许程序同时执行多个任务,从而提高了效率和响应性。在“C++实例教程:教程+源码”中,你将有机会深入理解并实践这一概念。以下是一些关于C++多线程编程的重要知识点:
1. **线程的基本概念**:
- 线程是程序的执行流,一个进程可以包含一个或多个线程。每个线程都有自己的执行上下文,包括程序计数器、栈和局部变量。
- 主线程是程序默认创建的第一个线程,其他线程由用户创建。
2. **C++11多线程支持**:
- 自C++11标准起,C++提供了内置的多线程支持,通过`<thread>`库来创建和管理线程。
- `std::thread`类用于表示线程对象,可以通过传递函数和参数来创建新线程。
3. **线程创建与销毁**:
- 使用`std::thread`构造函数启动新线程,如`std::thread my_thread(my_function, arg1, arg2);`
- 当线程完成执行或者调用`join()`或`detach()`后,线程对象才会被销毁。`join()`会等待线程结束,而`detach()`则使线程与主线程分离,不再关联。
4. **线程同步**:
- 线程同步是为了防止数据竞争,确保线程安全。C++提供了多种同步机制,如互斥量`std::mutex`、条件变量`std::condition_variable`、信号量`std::semaphore`等。
- 互斥量用于保护临界区,一次只允许一个线程访问;条件变量用于线程间的协调,让线程在满足特定条件时才能继续执行。
5. **线程通信**:
- `std::future`和`std::promise`允许线程间传递数据。`std::promise`在生产者线程设置值,`std::future`在消费者线程获取值。
- `std::async`可以异步执行函数,返回一个`std::future`,可以用来获取结果或等待任务完成。
6. **线程局部存储**:
- 使用`std::thread_local`关键字,可以创建线程局部变量,每个线程都有自己的一份副本。
7. **线程优先级**:
- 在某些平台上,C++提供`std::this_thread::get_id()`来获取当前线程ID,但线程优先级的设定并不统一,通常需要依赖于平台API。
8. **死锁**和**活锁**:
- 死锁是指两个或更多线程相互等待对方释放资源,导致无法继续执行。
- 活锁则是线程不断重试但无法取得进展的情况,通常通过超时或退避策略避免。
9. **线程池**:
- 为了更高效地管理线程,可以使用线程池,预先创建一组线程,当有新任务时,从池中分配线程而不是每次都创建新的。
10. **性能考虑**:
- 创建和销毁线程是有开销的,应尽量减少线程的创建和销毁,尤其是短生命周期的任务。
- 并发不一定等于并行,线程的调度由操作系统决定,过多的线程可能会导致上下文切换开销增大,反而降低效率。
通过这个C++实例教程和源码,你可以学习到如何在实际项目中应用这些概念,理解多线程编程的挑战和优势,以及如何编写高效的多线程代码。记得实践是检验真理的唯一标准,动手尝试这些示例,将有助于你更好地掌握C++的多线程编程技巧。