我试图在Linux中实现非常简单的Windows事件.仅适用于我的场景 - 3个线程,1个主线程和2个辅助线程.每个辅助线程通过SetEvent引发1个事件,主线程等待它.例:
int main()
{
void* Events[2];
Events[0] = CreateEvent();
Events[1] = CreateEvent();
pthread_start(Thread, Events[0]);
pthread_start(Thread, Events[1]);
WaitForMultipleObjects(2, Events, 30000) // 30 seconds timeout
return 0;
}
int* thread(void* Event)
{
// Do something
SetEvent(Event);
// Do something
}
Run Code Online (Sandbox Code Playgroud)
因此,为了实现它,我使用条件变量.但我的问题是 - 这是正确的方法吗?或者我做错了什么?我的实施:
// Actually, this function return pointer to struct with mutex and cond
// here i just simplified example
void* CreateEvent(mutex, condition)
{
pthread_mutex_init(mutex, NULL);
pthread_cond_init(condition, NULL);
}
bool SetEvent (mutex, condition)
{
pthread_mutex_lock(mutex);
pthread_cond_signal(condition);
pthread_mutex_unlock(mutex);
}
int …Run Code Online (Sandbox Code Playgroud) 这个问题询问是否可以以不影响延迟但使用更少 CPU 时间的方式改进自旋锁。大量答案表明了 C++11、Boost 等高级语言概念。
我的第一个想法是使用一个简单的 C 信号量,因为只有当缓冲区为空或已满时,海报才需要阻塞。
然而,在写答案的过程中,我意识到我不知道这些函数在实践中的开销是多少。直觉上,它似乎应该很小,而且对我来说从来都不是优化问题,但与自旋锁相比,它可能是很大的。据推测它也依赖于系统。
这个问题的答案表明,当锁定少于一个线程量子时,自旋锁是首选,但没有给出实际原因说明原因。
这个问题的答案提供了 C++ 中信号量实现的工作示例,该示例在主体中使用带有 pthread_wait 的自旋锁,但它并非取自任何实际的语言实现。
在这里,一些人认为有关互斥锁和信号量之间的速度差异的问题是微不足道的。其他人说信号量速度较慢。
此问题链接的一篇文章表明,在 2.4GhZ 机器上,互斥锁的 C# 锁定命令实际上需要 50 纳秒(因此大约 100 个周期)。然而,尚不清楚 C# 的实现是否代表 POSIX 信号量的直接 C 实现。
所以,问题是,在实践中信号量使用的开销是多少,并且通过扩展,如果我关心的是延迟(即由于某种原因而不是可维护性),我什么时候应该更喜欢自旋锁?