Synchronization 互斥锁对系统性能有什么副作用?

Synchronization 互斥锁对系统性能有什么副作用?,synchronization,embedded,real-time,mutex,Synchronization,Embedded,Real Time,Mutex,如果使用共享资源的多线程应用程序,则需要使用互斥锁对其访问进行序列化 如果我假设申请满足以下条件: 1-没有导致死锁、长时间等待或其他灾难性结果的互斥误用 2-共享资源具有处理所有互斥体问题的访问器方法(试图保持因等待互斥体释放而导致的延迟短于最大值) 接受互斥体是解决与共享资源保护相关的许多问题的方法。使用互斥锁是否会对性能产生任何副作用?如果是,应提供哪些替代方案(可能是其他同步机制) 为了更清楚我的意思,我会考虑下面的例子: 线程尝试读取多个线程之间共享的全局变量。如果我可以考虑: a-读

如果使用共享资源的多线程应用程序,则需要使用互斥锁对其访问进行序列化

如果我假设申请满足以下条件:

1-没有导致死锁、长时间等待或其他灾难性结果的互斥误用

2-共享资源具有处理所有互斥体问题的访问器方法(试图保持因等待互斥体释放而导致的延迟短于最大值)

接受互斥体是解决与共享资源保护相关的许多问题的方法。使用互斥锁是否会对性能产生任何副作用?如果是,应提供哪些替代方案(可能是其他同步机制)

为了更清楚我的意思,我会考虑下面的例子:

线程尝试读取多个线程之间共享的全局变量。如果我可以考虑:

a-读取操作需要(X us)

使用互斥锁会增加(Y us)的开销

c-读取操作不得超过Z us,其中Z>=X,但Z 然后我想我可能会假设互斥确保了互斥,但牺牲了对性能的负面影响(这可能是轻微或相当大的影响,取决于上下文)

互斥锁在许多情况下都很有用,但是有没有哪种情况应该避免(或替换)它们,因为它们会对系统性能产生负面影响,尽管它们在使用时非常小心


注意:这里我指的是作为内核服务提供的互斥体。我不是指任何试图模仿互斥(内核服务)的应用程序实现

如果您担心获得一个免费互斥然后释放它所增加的开销,那么您不必担心这一点。是的,获取和释放互斥体所需的代码为使用资源的线程增加了非零的开销。但根据我的经验,这种开销是可以忽略不计的,我不记得曾经担心过它,也不记得曾经解决过它。如果您需要一个互斥体来保护共享资源,那么您应该使用互斥体

如果您担心一个线程可能会占用资源太长时间,从而阻止另一个线程及时访问资源,那么这是一个合理的担忧,这就是您关心系统设计的原因。解决这一问题的一些设计技术包括:最大限度地缩短互斥锁的持有时间、线程优先级排序和优先级继承


在某些情况下,可以通过将对资源的访问限制为单个线程来避免使用互斥锁。换句话说,不要在线程之间共享资源。希望使用该资源的其他线程必须与该资源的线程通信。例如,可以有一个线程负责串行端口传输。需要发送串行消息的任何其他线程将向串行线程的邮箱或队列发出请求。串行线程只是挂起邮箱/队列,然后传输接收到的任何请求。这样就不需要互斥,因为串行线程是唯一直接使用资源的线程。请注意,这种技术仍然需要一些系统设计注意事项,因为邮箱/队列中可能会堆积多个请求,导致一些消息传输延迟。

如果您担心获得免费互斥然后释放它会增加多少开销,那么您不必担心这一点。是的,获取和释放互斥体所需的代码为使用资源的线程增加了非零的开销。但根据我的经验,这种开销是可以忽略不计的,我不记得曾经担心过它,也不记得曾经解决过它。如果您需要一个互斥体来保护共享资源,那么您应该使用互斥体

如果您担心一个线程可能会占用资源太长时间,从而阻止另一个线程及时访问资源,那么这是一个合理的担忧,这就是您关心系统设计的原因。解决这一问题的一些设计技术包括:最大限度地缩短互斥锁的持有时间、线程优先级排序和优先级继承


在某些情况下,可以通过将对资源的访问限制为单个线程来避免使用互斥锁。换句话说,不要在线程之间共享资源。希望使用该资源的其他线程必须与该资源的线程通信。例如,可以有一个线程负责串行端口传输。需要发送串行消息的任何其他线程将向串行线程的邮箱或队列发出请求。串行线程只是挂起邮箱/队列,然后传输接收到的任何请求。这样就不需要互斥,因为串行线程是唯一直接使用资源的线程。请注意,这种技术仍然需要一些系统设计注意事项,因为邮箱/队列中可能会堆积多个请求,从而导致一些消息传输延迟。

实际上,我担心的是互斥可能会导致额外的开销。我想知道,在某些情况下,使用互斥锁是否会带来与应用程序/任务用途相关的烦人开销。尽管如此,你的评论还是很有价值的。谢谢。事实上,我担心的是互斥造成的额外开销。我想知道,在某些情况下,使用互斥锁是否会带来与应用程序/任务用途相关的烦人开销。尽管如此,你的评论还是很有价值的。谢谢