C/C++ 多线程的学习心得总结
为什么要学习多线程
多线程技术可以大大提高程序的效率和响应速度,特别是在处理大数据量、复杂运算和网络通信等场景中,开启多线程可以让程序更快地完成任务,同时还可以提高CPU的利用率。
同时,在面试中,多线程也是一个非常重要的考察点,具备多线程技能的程序员也更加受市场欢迎和青睐。
学习多线程的基础知识
在学习多线程之前,我们需要先掌握以下几个基础知识:
- 进程和线程的概念及区别
- 线程的状态和生命周期
- 线程的同步和互斥
- 线程的通信方式
- 多线程编程的流程与注意事项
多线程的示例应用
示例1:计算素数
#include <iostream>
#include <thread>
#include <vector>
void calculatePrimes(std::vector<int>& primes, int start, int end) {
for (int i = start; i <= end; ++i) {
bool isPrime = true;
for (int j = 2; j < i; ++j) {
if (i % j == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
primes.push_back(i);
}
}
}
int main() {
std::vector<int> primes;
std::thread t1(calculatePrimes, std::ref(primes), 1, 5000);
std::thread t2(calculatePrimes, std::ref(primes), 5001, 10000);
t1.join();
t2.join();
for (int prime : primes) {
std::cout << prime << " ";
}
std::cout << std::endl;
return 0;
}
在此示例中,我们开启了两个线程来计算1~10000之间的素数,其中线程t1计算1~5000的素数,线程t2计算5001~10000的素数,并将结果存入共享的向量primes中。
示例2:生产者和消费者模型
#include <iostream>
#include <queue>
#include <thread>
#include <chrono>
#include <mutex>
#include <condition_variable>
std::queue<int> dataQueue;
std::mutex dataMutex;
std::condition_variable dataCond;
void producer() {
int i = 0;
while (true) {
std::unique_lock<std::mutex> lock(dataMutex);
dataQueue.push(++i);
std::cout << "producer produces data " << i << std::endl;
lock.unlock();
dataCond.notify_all();
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
void consumer() {
while (true) {
std::unique_lock<std::mutex> lock(dataMutex);
dataCond.wait(lock, []{return !dataQueue.empty();});
int data = dataQueue.front();
dataQueue.pop();
std::cout << "consumer consumes data " << data << std::endl;
lock.unlock();
std::this_thread::sleep_for(std::chrono::seconds(2));
}
}
int main() {
std::thread t1(producer);
std::thread t2(consumer);
t1.join();
t2.join();
return 0;
}
此示例实现了生产者和消费者模型,其中生产者负责生产数据,消费者负责消费数据,共享的数据队列使用std::queue实现,并使用互斥锁std::mutex和条件变量std::condition_variable实现线程的同步和互斥。生产者生产完数据后,通过条件变量通知消费者,消费者在条件变量的等待队列中等待其它线程的通知。如果数据队列中没有数据,则消费者进入等待状态,直到其它线程通知可以继续执行。
总结
对于初学者来说,多线程的学习需要掌握多个知识点,并循序渐进地进行深入学习和实践。在学习的过程中,需要注意多线程编程的注意事项,如线程安全、资源竞争等问题。同时,多线程技术在实际应用中有着广泛的应用场景,掌握该技能对于提高工作效率和职业发展都有着非常重要的意义。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C/C++ 多线程的学习心得总结 - Python技术站