gpt4 book ai didi

multithreading - 门环内外互斥锁速度差异

转载 作者:行者123 更新时间:2023-12-01 18:09:39 25 4
gpt4 key购买 nike

我对在 for 循环内部和外部使用互斥锁 lock() 和unlock() 的速度差异感到困惑。我得到了一个全局变量值和一个将其递增 1000000 倍的函数。该函数由 5 个线程并行运行。我测量了耗时并得到了这些结果:

    mutex.lock();
for(int i = 0; i < 1000000; i++)
{
value++;
}
mutex.unlock();

0.160921秒

和:

    for(int i = 0; i < 1000000; i++)
{
mutex.lock();
value++;
mutex.unlock();
}

2.10521秒

我认为第二个内部互斥体安排的控制太精细,并且在线程切换之间花费了大量时间?或者还有别的什么吗?

最佳答案

锁定和解锁互斥体需要一些时间。具体来说,它比递增整数需要更多的时间。您的第二个示例只是测试锁定/解锁速度,并且还增加了任务切换开销,因为在互斥体解锁的任何点上,不同的线程都可以接管。

在第一个例子中,编译器可以通过一次加法来替换循环。而且由于线程的整个功能都被互斥体覆盖,因此不存在并行执行;除一个线程外的所有线程都会被阻塞,直到该线程的循环完成为止,这意味着该代码相当于在单个线程上连续循环五次。

这与细粒度锁定和粗粒度锁定关系不大。这些策略与您是否有很少的锁覆盖大量资源,还是有很多锁覆盖很少的资源有关。您只有一种资源(全局整数),因此无需做出决定。

相反,这是关于是否将互斥体锁定一小段时间,从而使其在其余时间保持开放状态以供其他线程执行工作,或者将其锁定较长时间以避免开销,但会降低并行性。但是,由于您的线程除了访问 protected 资源之外不执行任何操作,因此不存在“其余时间”。您的问题(将整数递增 5000000 次)首先没有固有的并行性,因此多个线程无法利用。

关于multithreading - 门环内外互斥锁速度差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41531836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com