4

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

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

4

3 回答 3

3

Boost.Thread 提供条件变量,您可以方便地使用。

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

于 2012-10-17T12:25:23.383 回答
1

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

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

于 2012-10-17T12:28:08.660 回答
1

在windowsWaitForSingleObject中可以等待多种类型的句柄,例如线程句柄、事件句柄、信号量甚至互斥量,所以这个函数是等待一个对象变成信号,你不必等待其他线程变成死的!:)

// 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

于 2012-10-17T12:39:04.110 回答