为什么要锁定线程?
|
我已经阅读了很多有关锁定线程的示例。但是为什么要锁定它们呢?
据我了解,当您在不加入线程的情况下启动线程时,它们将与主线程和所有其他线程竞争资源,然后执行,有时同时执行,有时不执行。
锁定是否确保线程不会同时执行?
另外,同时执行线程有什么问题?那不是更好吗? (整体执行速度更快)
锁定线程时,它会全部锁定它们还是可以选择要锁定的线程? (实际上任何锁定都可以...)
我指的是使用诸如lock()之类的锁定函数并在线程模块btw中获取...
没有找到相关结果
已邀请:
2 个回复
懊毁暗
厢界山攀
现在,您可能知道这些线程中的任何一个都可以先完成并打印。您可能会看到两个输出30。 但是他们可能不会。 y是共享资源,在这种情况下,读取和写入y的位是所谓的“关键部分”的一部分,应使用锁进行保护。原因是您没有工作单元:任何一个线程都可以随时获取CPU。 这样思考: t1正在愉快地执行代码,并且命中
现在t1的a = 20并停止执行一段时间。 t2处于活动状态,而t1等待更多的CPU时间。 t2执行:
此时,全局变量y = 30 t2停止片刻停止,t1再次加速。它执行:
由于在设置b时y为30,因此b = 6且y现在设置为34。 打印的顺序也不是确定的,您可能会先获得30个或首先获得34个。 使用锁,我们将拥有:
这必定使这段代码线性化-一次仅一个线程。但是,如果整个程序是顺序的,则无论如何都不要使用线程。这个想法是,您可以根据执行外部锁并并行运行的代码所占的百分比来提高速度。这是(一个原因)为什么在2核系统上使用线程不会使所有性能提高一倍。 锁本身也是一个共享资源,但是它必须是:一个线程获取了锁,所有其他试图获取/ same /锁的线程都将阻塞,直到被释放。一旦释放,第一个向前移动并获取锁的线程将阻塞所有其他等待线程。 希望这足以继续下去!