信号量和自旋锁之间的基本区别是什么?
什么时候我们会使用信号量而不是自旋锁?
什么时候会使用信号量?
我能想到的唯一例子是限制同时访问相同数据/代码的线程数量......
信号量是最佳解决方案的任何其他场景?
我注意到提升似乎不支持信号量.获得类似效果的最简单方法是什么?
我写了一个写了一个程序,它没有像我期望的那样工作.我有两个线程:thread触发器func和anotherThread触发器anotherFunc.我想做的是当cont达到值10时func,anotherThread使用pthread_cond_wait和触发pthread_cond_signal.奇怪的是,如果我取消注释,一切正常sleep(1).我是线程的新手,我在这里遵循教程,如果我sleep在他们的例子中评论该行,它也会中断.
我的问题是如何在没有任何sleep()电话的情况下完成这项工作?如果在我的代码中func达到pthread_mutex_lock之后会发生什么anotherFunc?我该如何控制这些东西?这是我的代码:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t myMutex;
pthread_cond_t cond;
pthread_attr_t attr;
int cont;
void *func(void*)
{
printf("func\n");
for(int i = 0; i < 20; i++)
{
pthread_mutex_lock(&myMutex);
cont++;
printf("%d\n", cont);
if(cont == 10)
{
printf("signal:\n");
pthread_cond_signal(&cond);
// sleep(1);
}
pthread_mutex_unlock(&myMutex);
} …Run Code Online (Sandbox Code Playgroud) 这个问题询问是否可以以不影响延迟但使用更少 CPU 时间的方式改进自旋锁。大量答案表明了 C++11、Boost 等高级语言概念。
我的第一个想法是使用一个简单的 C 信号量,因为只有当缓冲区为空或已满时,海报才需要阻塞。
然而,在写答案的过程中,我意识到我不知道这些函数在实践中的开销是多少。直觉上,它似乎应该很小,而且对我来说从来都不是优化问题,但与自旋锁相比,它可能是很大的。据推测它也依赖于系统。
这个问题的答案表明,当锁定少于一个线程量子时,自旋锁是首选,但没有给出实际原因说明原因。
这个问题的答案提供了 C++ 中信号量实现的工作示例,该示例在主体中使用带有 pthread_wait 的自旋锁,但它并非取自任何实际的语言实现。
在这里,一些人认为有关互斥锁和信号量之间的速度差异的问题是微不足道的。其他人说信号量速度较慢。
此问题链接的一篇文章表明,在 2.4GhZ 机器上,互斥锁的 C# 锁定命令实际上需要 50 纳秒(因此大约 100 个周期)。然而,尚不清楚 C# 的实现是否代表 POSIX 信号量的直接 C 实现。
所以,问题是,在实践中信号量使用的开销是多少,并且通过扩展,如果我关心的是延迟(即由于某种原因而不是可维护性),我什么时候应该更喜欢自旋锁?
c++ ×3
semaphore ×2
boost ×1
boost-thread ×1
c ×1
linux ×1
locking ×1
multitasking ×1
performance ×1
pthreads ×1
real-time ×1
unix ×1
variables ×1