多线程的思考

多线程把握几点:

1. 一个对象or多个对象,做同样的事or不同的事,完成的目标。

举个例子:

服务器:服务器处理,多个用户的web请求。大致要做三件事,首先接收用户请求,建立连接。其次进行处理。最后返回结过给用户。这就可以分成三件事。分别是多个对象,分别干请求、处理、响应。目标:完成用户的请求。

卖票:不同的卖票人员,干着相同的事(卖票),目标:出售更多的票。


线程作为一个入口,许多对象在这个线程里做事。这个线程事是一件大事,但是需要多个对象的动作一起完成。

线程的通讯问题:

    一个线程把问题放入数据池里:里面指明哪个线程来处理,指令是什么,传递的数据。那么其他线程可以循环,检索自己是否属于条件,并删除数据。

当一个线程完成了工作,打算让原线程来实用该数据,那么可以采用放入数据池,但是原线程应该是下面两种状态之一:等待,循转。也可以采用去类似“消息”的方式,比如引用了原线程的一个变量,然后用此变量去执行。从机器执行角度来说是,这个其实是转到原线程的一个区域,IP指针被执行这一函数,但是要考虑,如果没有加锁,那么执行过程中,线程可能会被切换,可能IP会“跳跃”到本线程的另一个代码块中执行,那么考虑可能会使数据不一致,该代码块可能需要的数据并不是真是数据,因为原线程引用该变量执行还没有结束。

所以这也解释了,当外部的线程去操作界面时候,要去加锁,即可能执行一半的时候,我去点击某个按钮,那么两者数据不一致,势必会出现问题。


通讯的实例:线程2执行结束后,加锁,去引用线程1的一个变量,设置好数据后,解锁,此时线程将会按照分配的方式去跑。


qt写入锁:写入时,全部加锁,那么只会允许一个进入。

读取时,不会做此操作。

锁分几种:排他锁,此时屏蔽中断,只允许执行自己这个。同一个函数到同一位置,只允许一个。资源锁,实用资源前会检查资源锁是否满足。

大部分是,使用到某一资源的不同线程,用前会加锁,其他没有使用该资源/变量的不会加锁。也是不符合逻辑的。

你可能感兴趣的:(多线程的思考)