为啥 一个线程读数据,一个线程写数据,要加锁
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥 一个线程读数据,一个线程写数据,要加锁相关的知识,希望对你有一定的参考价值。
参考技术A 因为shared_ptr有两个数据成员,读写操作不能原子化”使得多线程读写同一个shared_ptr对象需要加锁。这个在我看来显而易见的结论似乎也有人抱有疑问,那将导致灾难性的后果,值得我写这篇文章。本文以boost::shared_ptr为例,与std::shared_ptr可能略有区别。shared_ptr的数据结构shared_ptr是引用计数型(referencecounting)智能指针,几乎所有的实现都采用在堆(heap)上放个计数值(count)的法(除此之外理论上还有用循环链表的法,不过没有实例)。具体来说,shared_ptr包含两个成员,一个是指向Foo的指针ptr,另一个是ref_count指针(其类型不一定是原始指针,有可能是class类型,但不影响这里的讨论),指向堆上的ref_count对象。ref_count对象有多个成员,其中deleter和allocator是可选的。day9--回顾
线程 vs 进程
进程:一堆资源集的集合。线程:操作系统能够调度的最小单位。
进程和线程的谁快是误区,进程至少包含一个线程,是没有可比性的。
线程:共享内存,两个线程同时操作一个数据,要加锁。全局GIL lock解释性锁。Lock,加锁;RLock()递归锁,即嵌套锁。线程同时操作一份数据的时候加锁。互斥锁(mutex)
join()等待线程执行结束。t = threading.Thread(target=函数名,args=(参数,)),t.start(),启动线程。
等待所有线程执行完毕,需要借助一个列表,把所有启动的线程添加到列表中,然后遍历,使用join()
线程里面,要想实现线程之间的交互,可以使用Event,通过设置标签,event.set()来让线程执行,清楚标签,event.clear(),清楚标签,让线程等待,就能实现两个线程之间的交互,启动不同的线程,通过检测标签是否存在,让另外一个线程执行或等待。
queue队列,通过队列的put()和get(),如果线程满了,就不能存入,如果线程空了,则不能获取,就会阻塞,来实现交互。
守护线程(setDaemon()):服务于非守护线程,当非守护线程结束之后,守护线程不管执行完毕没有,都会停止。setDaemon(True)设置守护线程。在start()之前设置。
queue(队列):1.程序的解耦,使程序之间实现松耦合;2.提高效率。进程间数据的安全交换。
FiloQueue() :后入先出
PriorityQueue():优先级queue,第一个是等级,第二个是值。
io操作不占用CPU,计算占用CPU。io:如从网上读取数据,从内存读取数据;
Python多线程是假的多线程,就是一个线程来回上下文切换,大量的计算使用多线程就不快,还不如单线程;
Python多线程,不适合CPU密集操作型的任务,适合io操作密集型的任务。socketServer是io密集型任务。
CPU密集型任务如何操作:多进程来操作,进程之间是独立的。Python线程和进程都是使用操作系统的原生线程和进程。
线程之间是相互独立的。
以上是关于为啥 一个线程读数据,一个线程写数据,要加锁的主要内容,如果未能解决你的问题,请参考以下文章