我想知道是否有相当于ManualResetEvent的提升?基本上,我想要一个跨平台的实现......或者,有人可以帮助我使用Boost :: thread来模拟ManualResetEvent的功能吗?谢谢你们提升等同于ManualResetEvent?
回答
当您有互斥锁和条件变量时,编写手动重置事件非常容易。
您将需要的是一个字段,表示您的重置事件是否发送信号。访问该字段需要用一个互斥锁来保护 - 这包括设置/重置事件以及检查是否有信号。
当你在等待你的事件,如果它目前没有信号,你会希望等待一个条件变量,直到它被发信号。最后,在设置事件的代码中,您将希望通知条件变量来唤醒正在等待事件的任何人。
class manual_reset_event
{
public:
manual_reset_event(bool signaled = false)
: signaled_(signaled)
{
}
void set()
{
{
boost::lock_guard<boost::mutex> lock(m_);
signaled_ = true;
}
// Notify all because until the event is manually
// reset, all waiters should be able to see event signalling
cv_.notify_all();
}
void unset()
{
boost::lock_guard<boost::mutex> lock(m_);
signaled_ = false;
}
void wait()
{
boost::lock_guard<boost::mutex> lock(m_);
while (!signaled_)
{
cv_.wait(lock);
}
}
private:
boost::mutex m_;
boost::condition_variable cv_;
bool signaled_;
};
我想你可能需要使用'boost :: condition_variable_any'才能工作。请参阅:http://stackoverflow.com/questions/8758353/whats-the-difference-between-stdcondition-variable-and-stdcondition-variable – Nick 2012-02-24 10:21:36
此外,condition_variable_any :: wait方法必须被赋予互斥量作为参数,不是锁守。 – Oliver 2013-02-27 13:37:21
嗯,我得到: 错误C2664'void boost :: condition_variable :: wait(boost :: unique_lock
存在IIRC,ManualResetEvent
允许多个线程等待一个对象,并且一个线程在对象被发信号时唤醒。 “手动重置”部分来自事实:系统在唤醒线程后不会自动重置事件;你这样做。
这听起来非常相似,condition variables:
的一般使用模式是一个线程锁定一个互斥体,然后对
condition_variable
或condition_variable_any
一个实例调用wait
。当线程从等待中被唤醒时,它会检查是否适当的条件成立,如果是,则继续。如果条件不成立,则线程再次呼叫wait
以恢复等待。
我基本上只有一个编写器线程,必须始终写入,永远不会被阻止,而我有一个读者线程,只有在编写器不写的时候才能读取......如果这是有道理的。谢谢 – Polaris878 2009-10-01 00:03:47
我会说你的设计很有意义。 – 2009-10-01 06:28:33
- 1. 等效于std :: async()的提升
- 2. 提升等效的memcpy?
- 3. class A在不同的类中等待Thread中的ManualResetEvent? [C#]
- 4. ManualResetEvent在处于等待状态时会消耗CPU吗?
- 5. ManualResetEvent不等待线程池完成
- 6. 使用ManualResetEvent等待多个Image.ImageOpened事件
- 7. Java的等价的.NET的ManualResetEvent和WaitHandle
- 8. c#多个线程等待一个ManualResetEvent
- 9. C#ManualResetEvent的Objective-C/Cocoa等价物
- 10. 等同于PosthreadMessage
- 11. “等同”与“等于”(或“绝对等于”)相同吗?
- 12. 不同索引的不同提升值
- 13. 关于使用ManualResetEvent用法c#?
- 14. 升压等效于Windows事件
- 15. 组等同于C#
- 16. Coolite等同于jQuery?
- 17. CompilerServices.Operators等同于C#
- 18. 'gdk_get_default_root_window'等同于Gtk#?
- 19. grails等同于grails.plugin.location
- 20. Mylyn等同于Netbeans?
- 21. DataList等同于WP7?
- 22. ARC等同于autorelease?
- 23. JNA等同于PVOID
- 24. mysqli_info()等同于PDO?
- 25. setTextColor等同于TextInputLayout
- 26. autoresetevent和manualresetevent
- 27. 将数组提升为不同的值
- 28. 提升不同的工具集
- 29. 错误,同时编译提升在Android
- 30. Elasticsearch同义词和类别提升
你想模拟哪种事件功能? – curiousguy 2011-10-19 02:53:21