首页 > 试题广场 >

4 [问答]解释至少3种线程同步方法。

[问答题]
解释至少3种线程同步方法。
1、利用锁机制
2、利用信号量
3、同步队列
发表于 2020-06-06 16:46:17 回复(0)

线程同步:当一个线程对内存进行操作时,其他线程都不可以对这个内存地址进行操作,知道发哦线程完成操作,其他线程才能对该内存地址进行操作,而其他线程又处于等待状态。

为什么要实现线程同步:一般情况下,创建一个线程时不能提高程序的执行效率的,所以要创建多个线程,但是多个线程同时运行时候可能调用线程函数,在多个线程同时对同一个内存地址进行写入操作时,由于cpu时间调度上的问题,写入数据会被多次覆盖,所以就要时线程同步。同步就是协同步调,按预定的先后顺序进行运行。

方式一:

threading的Lock类,用该类的acquire函数进行加锁,用realease函数进行解锁

方式二:

信号量也是提供acquire release方法,每当调用acquire方法时候如果内部计数器大于0,则将其减1,如果内部计数器等于0,则会阻塞该线程,直到有线程调用了release方法将内部计数器更新到大于1的位置。

方式三:

条件判断,即这种机制是在满足特定的条件后,线程才可以访问相关的数据。

使用condition类来完成,由于它也可以像锁那样用,所以它有acquire方法和release方法,而且它还有wait, notify, notifyall方法。

方式四:

同步队列put方法和task-done方法,queue有一个未完成任务数量num,put一次num+1 ,task一次num-1 任务都完成时任务结束。


发表于 2019-06-05 12:57:18 回复(0)
1 利用锁机制:acquire函数进行加锁,用realease函数进行解锁
当一个线程调用锁的acquire()方法获得锁时,锁就进入“locked”状态。每次只有一个线程可以获得锁。如果此时另一个线程试图获得这个锁,该线程就会变为“blocked”状态,称为“同步阻塞”。
直到拥有锁的线程调用锁的release()方法释放锁之后,锁进入“unlocked”状态。线程调度程序从处于同步阻塞状态的线程中选择一个来获得锁,并使得该线程进入运行(running)状态。
2 利用信号量
信号量也提供acquire()方法和release方法,每当调用acquire方法的时候,如果内部计数器大于0,则将其减1,如果内部计数器等0,则会阻塞该线程,直到有线程调用了release方法将内部计数器更新到大于1的位置.
3 同步队列
put方法和task_done方法,queue有一个未完成任务数量num,put依次num+1,task依次num-1.任务都完成时任务结束。
4.条件判断
所谓条件变量,即这种机制是在满足了特定的条件后,线程才可以访问相关的数据。
它使用Condition类来完成,由于它也可以像锁机制那样用,所以它也有acquire方法和release方法,而且它还有wait,notify,notifyAll方法。

发表于 2019-03-29 15:38:36 回复(0)
1 利用锁机制
2 利用信号量
3 同步队列
发表于 2019-01-19 14:40:29 回复(0)