C 在没有条件变量的pthread之间实现阻塞

C 在没有条件变量的pthread之间实现阻塞,c,linux,pthreads,ipc,pipe,C,Linux,Pthreads,Ipc,Pipe,我正在Linux上使用pthreads实现一个boss/worker设计模式。我想有一个老板线程,不断检查工作,如果有工作,然后唤醒一个睡觉的工人做工作。我的问题是:我应该使用什么类型的IPC同步/机制来实现boss线程交给我的工作人员和我的工作人员醒来之间的最小延迟 简单的解决方案是使用Pthread条件变量,在boss线程中调用Pthread_cond_signal,在每个工作线程中调用Pthread_cond_wait,但我想知道 是否有更快的方法可以用来实现阻塞和信令?例如,在老板和工人

我正在Linux上使用pthreads实现一个boss/worker设计模式。我想有一个老板线程,不断检查工作,如果有工作,然后唤醒一个睡觉的工人做工作。我的问题是:我应该使用什么类型的IPC同步/机制来实现boss线程交给我的工作人员和我的工作人员醒来之间的最小延迟

简单的解决方案是使用Pthread条件变量,在boss线程中调用Pthread_cond_signal,在每个工作线程中调用Pthread_cond_wait,但我想知道 是否有更快的方法可以用来实现阻塞和信令?例如,在老板和工人线程之间使用管道会如何

如何衡量一种IPC与另一种IPC的性能?例如,我看到pipe()和fork()的基准测试,但没有看到将pipe()用作线程间通信的基准测试

如果我能澄清我的问题,请告诉我

编辑
例如,我将如何使用pipe()在我的worker线程和boss线程之间实现阻塞,worker线程将读取()一个pipe,并且由于它是空的,因此将阻塞该read调用,直到boss对其调用write()。

我猜signal and wait是最好的方法。大多数操作系统都能识别线程,并且在中断到来之前可以让线程处于空闲状态。使用管道时,工人必须不断醒来并检查管道的输出。我发现的最佳效率测试通常是使用unix命令获取从开始到结束的运行时间(假设程序不打算在后台继续运行),设置一个脚本执行几次并进行比较。

我想信号和等待是最好的。大多数操作系统都能识别线程,并且在中断到来之前可以让线程处于空闲状态。使用管道时,工人必须不断醒来并检查管道的输出。我发现的最佳效率测试通常是使用unix命令获取从开始到结束的运行时间(假设程序不打算在后台运行),设置一个脚本执行几次并进行比较。

pthreads的glibc实现使用低级“futex”锁定以实现
pthread\u cond\u wait()
/
pthread\u cond\u signal()
。Futexes被设计为一种快速同步原语,因此它们的性能可能优于pipes或类似的方法(至少,使用pipes需要在Futexes不需要的内核空间之间复制一个字节)

如果
pthread\u cond\u wait()
/
pthread\u cond\u signal()
很好地映射到您的问题上(听起来它们确实如此),那么超越它们的唯一方法可能是在futexes上自己实现一些东西(例如,如果不使用它,您可以消除线程取消的处理)


可能值得对您的应用程序进行基准测试-除非您的工作单元确实非常小,否则条件变量唤醒延迟不太可能占主导地位。

pthreads的glibc实现使用低级“futex”锁来实现
pthread_cond_wait()
/
pthread_cond_signal()
。Futexes被设计为一种快速同步原语,因此它们的性能可能优于pipes或类似的方法(至少,使用pipes需要在Futexes不需要的内核空间之间复制一个字节)

如果
pthread\u cond\u wait()
/
pthread\u cond\u signal()
很好地映射到您的问题上(听起来它们确实如此),那么超越它们的唯一方法可能是在futexes上自己实现一些东西(例如,如果不使用它,您可以消除线程取消的处理)


对应用程序进行基准测试可能是值得的——除非您的工作单元确实非常小,否则条件变量唤醒延迟不太可能占主导地位。

您首先应该做的是确保您需要更快的速度。由于pthread信令是使用futex实现的,futex代表快速用户空间互斥,因此我认为您无法超越它们

如果您有等待的线程,根据定义,您将不得不唤醒它们,而通过内核的这种往返将是您不想要的延迟的来源

但你应该真正思考你的问题:

  • 如果您经常有工作要做,那么您的工作线程总是很忙。当前面的工作完成时,工作就会完成,而您不关心延迟

  • 如果重要的是boss检测到事件和worker开始工作之间的延迟,那么为什么要使用boss->worker模式

我的建议是,当你真的需要的时候,找一个更快的东西,这时你可能会有一个更详细的问题要问。也许我错了,但看起来你是在试图先发制人地优化,你可能知道这是所有邪恶的根源。当然,糟糕的设计可能会导致大量的返工,但在这里,您要处理的是实际设计决策的一个非常小的细节,即使用老板/工人模式


使用pthread_signal或semp_post()/sem_wait()实现您的设计,然后查看延迟的实际位置,以及它是否真的是一个问题。

您首先应该做的是确保需要更快的延迟。由于pthread信令是使用futex实现的,futex代表快速用户空间互斥,因此我认为您无法超越它们

如果您有等待的线程,根据定义,您将不得不唤醒它们,而通过内核的这种往返将是您不想要的延迟的来源

但你应该真正思考你的问题:

  • 如果您经常有工作要做,那么您的工作线程是alw