В моей программе на C ++ есть поток, который вставляет данные в буфер, и другой объект, который читает эти данные.
когда больше нет данных для чтения, я хочу подождать, пока другой поток не вставит новые данные.
Я в основном работаю на Linux, но я не знаю, как это сделать в Windows.
самая похожая вещь, которую я нашел, это функция «WaitForSingleObject», но это не совсем то, что мне нужно, так как я не хочу плакать, пока поток, который вставляет данные, не будет мертв.
Может кто-нибудь, пожалуйста, направьте меня туда, где я могу прочитать об этом больше?
Спасибо!
Вы можете использовать WaitForSingleObject с тайм-аутом. Ваш поток, который вставляет данные, может сигнализировать вашему потоку читателя, что больше нет данных. Вот хорошее чтение на эту тему:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686915%28v=vs.85%29.aspx
Boost.Thread предлагает переменные условия, что вы можете использовать переносно.
Если ваш компилятор поддерживает это, вы можете вместо этого использовать C ++ 11 станд :: condition_variable.
В окнах 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