【个人纪录】C++面试总结之二(多线程)

【个人纪录】C++面试总结之二(多线程)

由于本人是菜鸟级别,不严谨之处较多,欢迎大佬指正,在学习的路上不断狂奔

比如面试官问了一个多线程问题,然后就可以针对多线程这个问题适当展开,不至于问你一个就回答这一个问题,无法完全展示自己技能,适当的展开可以为面试加分哟

开始:

什么是进程,什么是线程?

进程:系统调度和分配的最小单元。线程:CPU调度和分配的最小单元。
一个进程至少有一个线程,就是主线程。
开发中使用多线程主要是为了提高产品的并发能力!提高运行效率!

如何创建线程?

C++11中引入了多线程技术,通过thread线程类对象来管理线程,
只需要#include即可,thread类对象的创建意味着一个线程的开始。
Thread first(线程函数名,参数1,参数2,…);
first.join(); // 等待线程结束,join是一个阻塞函数。
每个线程有一个线程函数,线程要做的事就写在线程函数中。

线程同步问题

一个进程内的资源供所有线程访问,有的资源可以同时被访问,有的资源一次只能被一个线程访问,比如一个静态全局变量a,线程1负责往里面写数据,线程2需要读取其中的数据,那么线程2在读取之前必须是线程1已经写入了数据,如果没有,那么线程2必须停下来等待线程1操作结束。这就是线程之间在某些地方上的合作关系,协同进行嘛,线程同步的“同”的意思也就是协同协作的意思。

那么怎么等待,就需要在线程1使用这个变量a之前加锁控制,保证这个时候a只被线程1使用,使用完之后释放锁,释放之后其他线程就可以排队使用a了。

接着上一段,若此时线程一在加锁后未释放该锁,那么其他待使用变量a的线程都将进入等待阻塞状态,若线程1中一直不释放锁,只锁不开,那么就是死锁的一种状态,一旦释放,那么将解决死锁 。这也是最简单的一种造成并解决死锁的方法。

如何解决死锁

解决死锁的原则:如果另外一个线程会依赖当前线程,那么就不要再让当前线程依赖那个线程了,即使有多层关系,原则不变。

(1),如果两个线程,都是先锁锁A,再锁锁B,那么就避免了死锁的发生。如果线程1先锁所A,等待锁B,线程2先锁锁B,等待锁A,就造成死锁,互相等待。
(2),可以用std::lock(mutex1,mutex2);来替代 mutex1.lock(); mutex2.lock();这两句。
因为std::lock(mutex1,mutex2);的作用是,同时将mutex1和mutex2锁成功,一旦有一个互斥量不能锁,线程就会卡在这里,直到两个锁可以被同时锁成功,这样就避免了死锁的现象。

猜你喜欢

转载自blog.csdn.net/hwx802746/article/details/108862963