C++中的多线程编程原理与实现
发布时间: 2024-03-29 04:15:28 阅读量: 42 订阅数: 24
# 1. 多线程简介
在本章中,我们将介绍多线程的基本概念,包括什么是多线程、多线程的优势和应用场景,以及多线程与单线程的对比。让我们一起深入了解多线程编程的基础知识。
# 2. C++多线程基础
在C++中,多线程编程是一项非常重要的技能。本章将介绍C++多线程的基础知识,包括线程创建与销毁、线程同步与互斥、线程通信与消息队列等内容。
#### 2.1 线程创建与销毁
在C++中,可以使用`std::thread`类来创建线程。下面是一个简单的例子,演示如何创建一个新的线程并执行指定的函数:
```cpp
#include <iostream>
#include <thread>
void threadFunction()
{
std::cout << "Hello from thread!" << std::endl;
}
int main()
{
std::thread myThread(threadFunction);
// 等待线程执行完毕
myThread.join();
std::cout << "Hello from main thread!" << std::endl;
return 0;
}
```
在上面的示例中,`threadFunction`函数会在新创建的线程中执行。通过`myThread.join()`函数,main线程会等待新线程执行完毕后再继续执行。
#### 2.2 线程同步与互斥
在多线程编程中,不同线程之间访问共享资源时可能会引发竞态条件。为了避免这种情况,我们可以使用互斥量(mutex)来保护共享资源。下面是一个简单的例子:
```cpp
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
int sharedData = 0;
void updateSharedData()
{
mtx.lock();
sharedData++;
mtx.unlock();
}
int main()
{
std::thread t1(updateSharedData);
std::thread t2(updateSharedData);
t1.join();
t2.join();
std::cout << "Shared data: " << sharedData << std::endl;
return 0;
}
```
在上面的示例中,两个线程同时访问`sharedData`变量,通过`std::mutex`保证了访问的互斥性,避免了数据竞争问题。
#### 2.3 线程通信与消息队列
在多线程应用中,线程之间通信是非常重要的。一种常见的线程通信方式是使用消息队列。下面是一个使用`std::queue`作为消息队列的例子:
```cpp
#include <iostream>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
std::queue<int> messages;
std::mutex mtx;
std::condition_variable cv;
void producer()
{
for (int i = 0; i < 10; i++)
{
std::unique_lock<std::mutex> lock(mtx);
messages.push(i);
cv.notify_one();
}
}
void consumer()
{
while (true)
{
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [] { return !messages.empty(); });
int msg = messages.front();
messages.pop();
std::cout << "Consumed message: " << msg << std::endl;
}
}
int main()
{
std::thread producerThread(producer);
std::thread consumerThread(consumer);
producerThread.join();
consumerTh
```
0
0