[英]Waiting with timeout - Windows
我的程序,在C ++中,有一个线程将数据插入缓冲区,另一个读取此数据的线程。 当没有更多数据要读取时,我要等到另一个线程插入新数据。 我主要在linux上工作,但我不知道如何在Windows中做到这一点。 我发现的最相似的东西是“WaitForSingleObject”函数,但它并不完全是我需要的,因为我不想哭,直到插入数据的线程死了。
有人可以指导我到一个我可以阅读更多的地方吗? 谢谢!
Boost.Thread提供了可以移植使用的条件变量 。
如果你的编译器支持它,你可以使用C ++ 11的std :: condition_variable 。
您可以使用WaitForSingleObject和timeout。 插入数据的线程可能会向读者线程发出信号,表明没有更多数据可用。 以下是关于这个主题的一些好的阅读:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686915%28v=vs.85%29.aspx
在Windows中WaitForSingleObject
可以等待多种类型的句柄,例如一个线程的句柄,一个事件的句柄,一个信号量甚至是互斥,所以这个函数是等待一个对象变成信号,你不是被迫等待其他线程来变死了!:)
// Global
HANDLE hHasData = CreateSemaphore(
NULL, // Security attribute, NULL means default
0, // Initial count of semaphore
100, // Maximum count of semaphore
NULL // Name of semaphore, will be used to share it between processes
);
// Producer thread
auto data = produce_data();
push_data_to_queue( data );
ReleaseSemaphore( hHasData );
// Consumer thread
while( true ) {
WaitForSingleObject( hHasData, INFINITE );
auto data = pop_data_from_queue();
process_data( data );
}
此外,如果您关心跨平台代码,您可以使用C ++ 11线程和同步对象,如std::condition_variable
或其对应的boost::condition_variable
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.