投票 `pthread_mutex_trylock` 有意义吗?
Does it make sense to poll `pthread_mutex_trylock`?
考虑一个具有两个线程的多核系统运行:线程 A 和线程 B,它们共享一些数据。线程 A 需要尽可能快地完成它的工作,所以我们希望它尽可能频繁地被唤醒。
放弃使用自旋锁(pthread 或在原子原语之上实现),因为我们希望线程 B 在等待获取锁时进入休眠状态。
按以下方式混合忙等待(自旋锁)和 "sleepy wait" 是否是可接受的解决方案?:
pthread_mutex_t mutex; // Already initialized somewhere
SharedData data; // Structure for interthread communication
// Thread A (high throughput needed => spin)
while (appRunning) {
while (pthread_mutex_trylock(&mutex) != 0) { } // Controversial point
// Read/write to data
pthread_mutex_unlock(&mutex);
}
// Thread B (should sleep during wait => standard locking)
while (appRunning) {
pthread_mutex_lock(&mutex);
// Read/write to data
pthread_mutex_unlock(&mutex);
}
PS:我试图做到通用,但如果重要的话,实际情况是线程 A 根据线程 B 通过共享数据请求的内容填充低延迟音频缓冲区,并且在那里写了一些结果。线程 B 对用户输入做出反应,只要线程 A 没有运行不足,它需要一段时间才能做出反应是可以接受的。
使用锁(互斥锁或自旋锁)不是低延迟场景的正确解决方案。
最好只共享少量数据,然后就可以在单个原子指令中交换数据。
另一种解决方案是拥有 2 个数据实例并交换指向它的指针。
如果以上方法不适合您,并且您必须回退到互斥锁或自旋锁,您应该更喜欢自旋锁。
使用自旋锁,唤醒时间会更短,因为您没有上下文切换。
当线程 B 持有锁时,线程 A 将不得不等待(自旋)。并且你可以限制线程B不要太频繁地获取锁。
线程 B 可以尝试获取锁,频率不超过一次,如果失败则休眠一段时间。
考虑一个具有两个线程的多核系统运行:线程 A 和线程 B,它们共享一些数据。线程 A 需要尽可能快地完成它的工作,所以我们希望它尽可能频繁地被唤醒。
放弃使用自旋锁(pthread 或在原子原语之上实现),因为我们希望线程 B 在等待获取锁时进入休眠状态。
按以下方式混合忙等待(自旋锁)和 "sleepy wait" 是否是可接受的解决方案?:
pthread_mutex_t mutex; // Already initialized somewhere
SharedData data; // Structure for interthread communication
// Thread A (high throughput needed => spin)
while (appRunning) {
while (pthread_mutex_trylock(&mutex) != 0) { } // Controversial point
// Read/write to data
pthread_mutex_unlock(&mutex);
}
// Thread B (should sleep during wait => standard locking)
while (appRunning) {
pthread_mutex_lock(&mutex);
// Read/write to data
pthread_mutex_unlock(&mutex);
}
PS:我试图做到通用,但如果重要的话,实际情况是线程 A 根据线程 B 通过共享数据请求的内容填充低延迟音频缓冲区,并且在那里写了一些结果。线程 B 对用户输入做出反应,只要线程 A 没有运行不足,它需要一段时间才能做出反应是可以接受的。
使用锁(互斥锁或自旋锁)不是低延迟场景的正确解决方案。
最好只共享少量数据,然后就可以在单个原子指令中交换数据。
另一种解决方案是拥有 2 个数据实例并交换指向它的指针。
如果以上方法不适合您,并且您必须回退到互斥锁或自旋锁,您应该更喜欢自旋锁。
使用自旋锁,唤醒时间会更短,因为您没有上下文切换。
当线程 B 持有锁时,线程 A 将不得不等待(自旋)。并且你可以限制线程B不要太频繁地获取锁。
线程 B 可以尝试获取锁,频率不超过一次,如果失败则休眠一段时间。