我的程序,在C ++中,有一个将数据插入缓冲区的线程,以及另一个读取此数据的线程。 当没有更多数据要读取时,我要等到另一个线程插入新数据。 我主要在linux上工作,但我不知道如何在Windows中做到这一点。 我发现的最相似的东西是“WaitForSingleObject”函数,但它并不是我所需要的,因为我不想哭,直到插入数据的线程死了。
有人可以指导我到一个我可以阅读更多的地方吗? 谢谢!
答案 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