如何在我的C代码中最小化互斥体的使用?

时间:2010-02-26 12:54:01

标签: operating-system

在我的一个c代码文件中,需要通过该文件中的几乎每个过程进行更新的全局变量之一,每次和每个地方都使用互斥锁进行锁定和解锁。

据我所知,使用mutex的锁定和解锁过多的同步肯定会降低性能。

所以,我的疑问是我如何获得性能水平或如何减少互斥量的使用?

我希望我的问题很明确,否则请告诉我。我会更加清楚。

6 个答案:

答案 0 :(得分:4)

如果使用Windows,并且仅在应用程序中需要同步,请改用CriticalSection。这比Mutex要快得多。

答案 1 :(得分:3)

您可以使用message-passing concurrency通过消除代码正文中的共享状态来抽象掉互斥锁。

答案 2 :(得分:1)

您是否已经分析了代码,以确定锁定和解锁互斥锁花费了太多时间?在你拥有之前不要试图优化。没有硬数据的优化通常会浪费精力。

假设:

  • 您已确定互斥锁操作 是一个相当大的性能损失;和
  • 你无法使互斥体的解析更精细(例如,单独的互斥体可以减少争用,因为你不是在讨论一个变量)。

您可以查看特定于操作系统的功能,例如原子增量和减少而不使用互斥锁。这些不是可移植的C,但您可以使用定义来定位特定的操作系统功能(Interlocked*用于Windows,而GCC __sync_*调用是我首先查看的位置。

答案 3 :(得分:0)

您可以将互斥操作分解为单独的函数以使代码更清晰。但是你无法节省操作本身 - 你需要并且确实使用同步,或者你不需要也不要使用它。

答案 4 :(得分:0)

如果您的应用程序可以重构,只使用一个线程,则不再需要互斥锁。

答案 5 :(得分:0)

使用不可变版本替换线程之间共享的一些可变数据结构。不可变数据结构始终是线程安全的。 (你改变它是一个新的副本。)这基本上是为了简化代码的速度。