繁体   English   中英

等待超时 - Windows

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM