boost::threads ошибка в example
От: NoHate  
Дата: 22.02.08 06:09
Оценка: 1 (1)
Добрый день. Разбираюсь с 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
Re: boost::threads ошибка в example
От: pvirk Россия  
Дата: 22.02.08 08:10
Оценка:
Здравствуйте, NoHate, Вы писали:

Наверное они просто не стали заморачиваться с синхронизацией вывода на консоль. Смысл же примера, как я понимаю, не в этом, а в использовании передачи/приёма через bounded_buffer.
Re[2]: boost::threads ошибка в example
От: NoHate  
Дата: 22.02.08 10:15
Оценка:
Здравствуйте, pvirk, Вы писали:
P>Наверное они просто не стали заморачиваться с синхронизацией вывода на консоль. Смысл же примера, как я понимаю, не в этом, а в использовании передачи/приёма через bounded_buffer.

Я тоже так подумал вначале, но во-первых: стыдно же, а во-вторых: в соседнем примере tennis.cpp есть такой код:

...
    boost::thread::sleep(xt);
    {
        boost::mutex::scoped_lock lock(mutex);
        std::cout << "---Noise ON..." << std::endl;
    }

    for (int i = 0; i < 1000000; ++i)
...


Здесь, как видите, все сделано верно: раз пишем в поток, то лочим его.
Re[3]: boost::threads ошибка в example
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 22.02.08 11:49
Оценка:
Здравствуйте, NoHate, Вы писали:

[]

Напиши им в maillist.
Re[4]: boost::threads ошибка в example
От: NoHate  
Дата: 22.02.08 12:11
Оценка:
Здравствуйте, Alxndr, Вы писали:
A>Напиши им в maillist.
Ну да, видимо так и сделаю. Просто решил удостовериться, что не я гоню.
Re: boost::threads ошибка в example
От: Sni4ok  
Дата: 22.02.08 14:32
Оценка:
Здравствуйте, NoHate, Вы писали:

а смысл синхронизировать std::cout,
он и так синхронизироваться системой должен
Re[2]: boost::threads ошибка в example
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 22.02.08 14:45
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>а смысл синхронизировать std::cout,

S>он и так синхронизироваться системой должен

Но не вся цепочка вывода в поток (std::cout << foo << bar).
Re: boost::threads ошибка в example
От: jazzer Россия Skype: enerjazzer
Дата: 23.02.08 14:58
Оценка:
Здравствуйте, NoHate, Вы писали:

NH>И эти люди не разрешают мне ковырять в носу? (С)

NH>Может я что не понимаю? Это же пример того, как правильно с потоками роботать!
NH>Версия: boost 1.34.1

Не занудствуй.
Нашел баг — пошли разработчикам: http://svn.boost.org/trac/boost/newticket
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.