用户级线程 + 内核的LWP = Linux线程
OS概念中经常说的
用户级线程 和 内核级线程 也就是线程实现真的是在OS内部实现,还是应用层或用户层实现
很明显Linux是属于用户级线程
用户级执行流(用户级线程) :内核lwp = 1 : 1
也有1:n的当我们今天不管了
下面来谈谈线程库中的栈
这个栈不仅仅要简单的变量定义,入栈出战
每个执行流本质都是一条调用链
栈结构本质是为了支持应用层完成整个函数调用链所对应的
临时变量空间的开辟和释放
所以主线程当然要有自己的调用链
新线程在执行流上和主线程是独立的,所以他们形成调用链时
必定每一个人都要有自己独立的栈结构,让自己的调用链不受别人的
干扰,所以每一个线程都要有自己的栈结构。
站在线程角度每个线程都有自己独立的栈结构,但并不是说我
想访问你这个栈我就访问不了,其实有办法
创建多线程
把pthread_create套进循环里,每次形参的tid用vector来管理起来
也方便后续等待
创建线程给线程入口函数传参时,可不可以传入for循环中的临时变量?
肯定是不可以的,for循环结束 td变量也就释放了,你传的是临时变量的地址,你不能让线程指向主线程的栈而且还是一个临时变量,传参很大可能会翻车。
用全局变量传参呢?可能就不只需要定义一个因为是多线程
我们直接new出来一个数据对象给线程传参,这是比较原始的方法。
td变量指向的内容是堆空间的,每一次for循环都会重新创建堆空间
所以每个线程都可以访问属于自己的堆空间。
(也可以用容器,容器的本质不也是在堆上开辟吗,那套的层就多了,麻烦。)
从这个例子可以看出,所以线程一定是共享堆空间的,要不然我随便传给你一个堆空间上的对象怎么能传给你?
说明堆空间其实被大家线程共享,只不过我们一人一个罢了
我们不要互相干扰,如果今天我就是想让线程1访问线程2 的堆空间
能做到吗?绝对可以
我们把所有堆空间指针放到一个数组里保存起来,我不就可以访问了。
但我们不这么做。
我们一个线程拿着属于自己的一个指针就走了