首先还是那个问题,我们为什么需要多线程?单线程编程做的好好的,又简单又好用,为什么要弄出一个多线程编程呢?难道前人是为了设计而设计了个多线程的?显然这是不可能,那么是什么原因呢?用最精炼的语言概括无非就是以下两个原因。
效率和用户体验
效率主要体现在服务端,用户体验更多是体现在客户端,当然肯定不是说效率只体现在服务端,用户体验只体现在客户端,无论是效率还是用户体验在服务端和客户端上都会体现,只是说侧重点不一样,这一点大家要注意下。
那么多线程到底是什么呢?在计算机术语中也可以叫并发,指的是在单个系统里同时执行多个独立的活动,而不是顺序的一个接一个的执行。假设这样的一个场景,你在一个软件中要导入100万条的数据,如果你用单线程,那么你在导入的过程中,你只能等待它导完,其他什么事你都做不了,因为软件会卡在那里,之所以卡在那里,是因为软件里面在传输数据,而你是用单线程,数据还没传输完,下面的代码无法执行。所以这个时候你必须用多线程,开启一个线程来导入这100万条数据,这样才能保证在导入数据的同时,你还可以在软件上做其他操作。
大家要注意一点,在单核CPU上面,并发并不是真正的并发,而是通过时间片轮询的方式来看起来像是并发,真正的并发应该是在多核CPU上面。
说完了多线程的相关概念,我们来说一说多线程编程。在早期C 11之前,C 在语言级别上并不支持多线程,要想实现多线程,必须通过第三方库或者调用平台系统函数来实现的,而不同平台的多线程的系统函数又都不一样,所以给多线程编程带来了很多麻烦。但是从C 11开始,C 终于开始在语言级别上支持多线程,我们也终于可以用一份代码在多个平台上跑了。
那么C 如何实现线程呢?以下是一个实现线程的简单的例子
代码语言:javascript复制#include <iostream>
#include <thread>
using namespace std;
void thread_task()
{
cout << "hello thread" << endl;
}
int main()
{
thread t(thread_task);
t.join();
cout << "thread end" << endl;
return 0;
}
thread t(thread_task)这个是打开C 多线程世界的一个最简单也是最基础的一行代码,从此C 开始从语言级别上支持了多线程。
以上是一个非常简单的C 多线程的例子,main函数是主线程,thread_task是子线程,thread t(thread_task)意思是启动这个子线程,join()会使主线程会被阻塞,直到子线程执行完毕,然后才退程序。
所以从这个例子大家可以看出C 多线程写法是多么的简洁,让人充满的学习的欲望。