等待超时 - Windows

时间:2012-10-17 12:24:07

标签: c++ windows semaphore

我的程序,在C ++中,有一个将数据插入缓冲区的线程,以及另一个读取此数据的线程。 当没有更多数据要读取时,我要等到另一个线程插入新数据。 我主要在linux上工作,但我不知道如何在Windows中做到这一点。 我发现的最相似的东西是“WaitForSingleObject”函数,但它并不是我所需要的,因为我不想哭,直到插入数据的线程死了。

有人可以指导我到一个我可以阅读更多的地方吗? 谢谢!

3 个答案:

答案 0 :(得分:3)

Boost.Thread提供condition variables,您可以移植使用。

如果你的编译器支持它,你可以使用C ++ 11的std::condition_variable

答案 1 :(得分:1)

您可以将WaitForSingleObject与超时一起使用。插入数据的线程可能会向读者线程发出信号,表明没有更多数据可用。以下是关于这个主题的一些好读物:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686915%28v=vs.85%29.aspx

答案 2 :(得分:1)

在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