Добрый день. Разбираюсь с boost::threads.
В папке boost\libs\thread\example лежит пример conditions.cpp.
Открыл, смотрю. Чувствую — что-то не то. Потом заметил.
В файлике примерно следующее:
class bounded_buffer : private boost::noncopyable
{...};
bounded_buffer buf(2);
void sender() {
int n = 0;
while (n < 100) {
buf.send(n);
std::cout << "sent: " << n << std::endl; // <-- Где синхронизация?
++n;
}
buf.send(-1);
}
void receiver() {
int n;
do {
n = buf.receive();
std::cout << "received: " << n << std::endl; // <-- Где синхронизация?
} while (n != -1); // -1 indicates end of buffer
}
int main(int, char*[])
{
boost::thread thrd1(&sender);
boost::thread thrd2(&receiver);
thrd1.join();
thrd2.join();
return 0;
}
Решил проверить, скомпилировал. Результат подтвердил мои опасения:
received: 96
received: sent: 97 // <--
sent: 98
sent: 99
97 // <--
received: 98
И эти люди не разрешают мне ковырять в носу? (С)
Может я что не понимаю? Это же пример того, как правильно с потоками роботать!
Версия: boost 1.34.1