在 C++ 中使用互斥锁和条件变量实现带有信号的监视器

Posted

技术标签:

【中文标题】在 C++ 中使用互斥锁和条件变量实现带有信号的监视器【英文标题】:Implementing Monitor with signaling using mutex and condition variable in C++ 【发布时间】:2009-07-31 07:09:20 【问题描述】:

是否有任何机构使用 C++ 中的互斥锁和条件变量实现了带有信号(唤醒等待线程)的 Monitor。

我不知道如何开始。任何示例代码或在线文章都会很棒。 有没有实现这些的开源库?

我需要 windows 和 linux。但是从 windows(win32) 开始就可以了。

【问题讨论】:

抱歉,您的问题是什么,为互斥锁和条件编写一些可移植代码或学习如何使用它们? 我想要在 C++ 中使用互斥锁和条件变量的带有信号的监视器类。我自己编写一个监视器类既困难又耗时。我确信有人会实施它,但找不到它。所以我发布了这个问题。 【参考方案1】:

This Qt Quarterly article 解释了如何使用 Qt 的 QMutex 和 QWaitCondition 来做到这一点。但是你应该能够用你想使用的任何互斥类重新实现它..

另请参阅here..中的更高级示例。

【讨论】:

+1 非常清晰的文章,并且很容易应用到其他工具包中【参考方案2】:

查看boost::thread::condition_variable 以及示例。 它可用于等待有或没有超时的条件。我认为这是一个相当优雅的解决方案,在这种情况下应该完全满足您的需求,并以可移植的方式完成。

【讨论】:

【参考方案3】:

Mozilla 的平台抽象库NSPR (Netscape Portable Runtime)有一个跨平台的监视器抽象。这是一个“真正的”实现(例如实际上在 Firefox 中使用),所以它并不简单。但它是一个监视器。

来源:prmon.c,prmon.h

文档:prmon.html

【讨论】:

【参考方案4】:

我在这里为 posix 系统制作了一个:http://asgaard.homelinux.org/svn/cpp/threadqueue/ 这里有一个 C 变体:http://asgaard.homelinux.org/wordpress/?p=9

【讨论】:

【参考方案5】:

我在 C++ 中完成的所有线程编程都使用了 pthread,它具有您需要的基本构建块。这个article 讨论了将这些构建块用于监视器

由于某种原因链接不起作用,将相同的 URL 粘贴到浏览器中即可。

http://findarticles.com/p/articles/mi_m0VVT/is_10_2/ai_n24998136/

【讨论】:

以上是关于在 C++ 中使用互斥锁和条件变量实现带有信号的监视器的主要内容,如果未能解决你的问题,请参考以下文章

信号量,互斥锁,读写锁和条件变量的区别

信号量互斥锁和条件变量的区别

信号量

使用信号量的进程之间的互斥[关闭]

Linux下的互斥锁和条件变量

使用 pthread、互斥锁和条件变量解决哲学家就餐问题