Вам нужна переменная условия .
Обратите внимание, что даже когда ваш поток чтения получает мьютекс, связанный с условной переменной, он должен проверить, что условие выполнено. Возможно, пусть установщик установит флаг, когда он что-то установил, и читатель сможет сбросить его, когда прочтет.
Это нуждается в уточнении, но сделает работу. Я бы обычно использовал std :: deque, чтобы писатель мог написать, что нужно заблокировать, но не нужно ждать, пока поток прочитает.
class mySafeData
{
public:
mySafeData() : myData(0), changed( false )
{
}
void Set(int i)
{
boost::mutex::scoped_lock lock(myMutex);
while( changed )
myCondvar.wait( lock ); // wait for the data to be read
myData = i; // set the data
changed = true; // mark as changed
myCondvar.notify_one(); // notify so a reader can process it
}
void Get( int& i)
{
boost::mutex::scoped_lock lock(myMutex);
while( !changed )
{
myCondvar.wait( lock );
}
i = myData;
changed = false; // mark as read
myCondvar.notify_one(); // notify so the writer can write if necessary
}
private:
int myData;
boost::mutex myMutex;
boost::condition_variable myCondvar;
bool changed;
};