很快,我们将在11月29日至30日在圣彼得堡和12月6 日至7 日在莫斯科举行第六届.NET研讨会 。 这次是关于多线程和竞争力的话题。 我们已经在哈布雷(Habré)上写过几次了,但是今天有一个单独的原因:研讨会是真正的独家活动 。 将描述混合同步原语的操作: Monitor
。 是的,熟悉的小事情值得单独报告。 毕竟,在他的工作中,他同时考虑了处理器频率和内核数,并考虑了锁护/饥饿问题,并且总的来说非常复杂。
在娱乐性文章的结尾,我将建议您进行有关多线程的两个测验。

研讨会的一个小场景
来自操作系统的最重要的事情是线程调度。 毕竟,它们可以彼此并行工作(当它们当前在不同的内核上运行时),并且可以更频繁地(如果我们在谈论相同的线程)按顺序工作。 毕竟,操作系统并没有给每个人太多的执行时间,在此之后,它给了其他人一些时间。 第二个-对于此段-量子-可以分配不同的时间量。 例如,根据我们使用的操作系统的版本:服务器还是用户,UI线程是否是具有当前活动窗口的进程线程。 第三,有优先级和“挤出多任务”的概念,当您的流程仅收到宝贵的量子时,可能会丢失它,因为 形成了具有更高优先级的另一个线程。 事实证明,我们的应用程序高度依赖其工作环境。 例如,当计算机上根本没有其他服务时,某些计算服务将在OS的服务器版本(或具有适当的性能设置)上感觉最佳:量子将很长,并且会有大量的量子时间。
但是这里又出现了一个问题:如果我们在此配置上的线程建立了内核级锁定(例如,信号量(1)),第二个线程进入了该锁定并进入了该锁定,那么它将在服务器操作系统中停留的时间比原来更长。将是自定义的。 怎么了 是的,因为服务器的时间片比客户端的时间片长6倍,并且该线程将首先必须等待,直到第一个流到达锁定释放点,然后再获取新的时间。
但是,在这种情况下有帮助:释放锁时,所有暂时(以1个数量级)期望它的线程都比其他线程具有优先级,第二个线程将立即获得处理器时间。
CLRium 6
这三个段落占第四次报告的5%。 而且他已经拥有可以在所有级别使用的信息,从使用同步原语到使用高级库都可以使用。 我们的程序是这样的:
- 我们将研究过程的类型。 它们很多,我们从实力上使用其中两个:它们是普通的和ModernApp。
- 连续三个报告是操作系统级别的线程:在单核,多核系统和NUMA系统上进行调度。 各地都有不同的规则,在您的工作中必须考虑到这一点;
- 在量子时间级别分析同步原语的工作。 你们都学会了在采访中谈论锁/互斥锁/信号量。 重复是没有意义的,因此我们将使用时间轴来武装自己,并查看如何在所有同步原语(内核空间,用户空间和混合同步原语)上的处理器之间分配量子。
- 真正的专有研讨会:
Monitor
原语的结构。 您可能已经在没有我的情况下try { } finally { }
在lock(){}
发现了lock(){}
的事实,但是其中显示Monitor.Enter
, Monitor.Leave
, Monitor.TryEnter
的内容是一个单独的,密集的,完整的报告地狱的主题。 相信我,他内心的一切都很酷。 这是一种混合同步原语,旨在避免饥饿,过多的锁和锁护卫队逃脱。 - 多达三份关于无锁和无等待的可靠报告,包括侦察无人机和防空兵的例子,试图击落这些无人机。 这些报告受到HighLoad ++的喜爱, 于11月7日至8日在莫斯科被称为HighLoad ++ 。
- 有关PLINQ和Async-Await的一系列报告。 一切也尽可能详细。 并非一clock而就:互联网上的东西已经足够了。 每种技术都会“从内部”被告知:这是CLRium的惯例。
- 研讨会将以关于Microsoft和Intrinsics的无锁集合库的两个报告(用于处理器级别并行化的矢量指令)结束。
一些统计
我们是美国最大的研讨会,总的来说,我们并不是一个会议,只是因为我们喜欢我们的形式。 您不会在不会进入的报告中选择。 你为一切努力。 此外,您预先了解研讨会的所有主题都对您感兴趣,因为 主题是一个。 另一个记录将在CLRium 6上创下:两个城市将有700人在场。 大约有700人在并行化和竞争中发挥自己的技能。 他们将去接受采访。 来吧,你来找我们:)。