|
|
1
4
在这里大声思考…不确定这有多有效,但是: 可以创建锁定某些索引的方法:
注: 这是一个想法的开始,所以现在不要太用力了!它也是未经测试的伪代码。这并不是最终的答案,而是一个起点。请添加评论以改进或建议这是/不合理的。 进一步要点:
但作为一个概念——可行吗?我想如果你真的需要快速访问(也许你会这样做),这可能不是那么有效,思想? 更新
如果每个线程/工作线程在
测试/结果我为此实现了一个测试程序,只是因为我非常喜欢这种类型的东西。我的实现是 here 我认为这是一个公共的Github回购-所以欢迎你看看。但我将结果发布在顶级自述文件上(所以滚动一点查看它们)。我做了一些改进,比如:
总结:当工作负载为1毫秒(执行每个操作所需的时间)时,完成的工作量为:
当工作负载为0毫秒(基本上增加几个计数器)时,完成的工作量为:
在这里,你可以看到使用静音保护可以将工作速度降低大约三分之一(1/3)。这个比率在测试之间是一致的。 我也对1个工人进行了同样的测试,同样的比率大致保持不变。但是,当我使数组更小(~1000个元素)时,对于工作负载为1毫秒的情况,完成的工作量仍然大致相同。但是当工作负载非常轻时,我得到如下结果:
结论
锁似乎只是增加了一个开销,比增加几个计数器慢2-3倍。这可能是由于实际碰撞造成的偏差,因为(从结果来看)记录的最长锁定时间是40毫秒-但当时工作时间非常快,所以发生了许多碰撞(每次碰撞约8个成功锁定)。 |
|
|
2
1
这取决于访问模式,您是否有有效地划分工作的方法?基本上,您可以将数组划分为8个块(或尽可能多的块),并用互斥体覆盖每个部分,但是如果访问模式是随机的,那么仍然会有很多冲突。 您的系统上有TSX支持吗?这将是一个经典的例子,只有一个全局锁,并且让线程忽略它,除非发生实际的冲突。 |
|
|
3
1
您可以编写一个类,当某个特定的索引需要它时,它将动态地创建锁,
你也可以用
使用这个类并不一定意味着您需要创建所有1000000个元素。您可以使用modulo操作将locker视为mutex的“哈希表”:
值得一提的是,“哈希表”方法使得死锁非常容易(
|
|
|
4
0
还有其他的折衷办法,比如细颗粒锁定。原子操作是昂贵的,因此锁定每个元素的并行算法可能比顺序版本花费更长的时间。 如何有效锁定取决于。数组元素是否依赖于数组中的其他元素?你主要是在看书吗?大部分是写作?
我不认为有8个互斥是这里的方法。如果一个给定的锁保护一个数组部分,那么在并行执行过程中,如果不引入争用条件(使互斥体无意义),就不能将其切换为保护另一个部分。
数组项是否小?如果可以将它们减少到8个字节,则可以用
|
|
|
user107586 · 如何处理等待句柄不会导致无限循环? 1 年前 |
|
|
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 1 年前 |
|
|
BenjiFB · C#内存缓存:在一次操作中追加到列表? 1 年前 |
|
|
András Takács · Python多线程问题 1 年前 |
|
|
András Takács · Python多线程错误 1 年前 |