boost::thread_specific_ptr не обнуляет значение
От: mgopshtein  
Дата: 07.06.09 09:36
Оценка:
Добрый день,

Имеем такой код как приведен внизу. Я ожидал что get() вернет NULL после удаления thread_specific_ptr, а он помнит старое значение. Есть на то причины?

Спасибо.
#include <boost/thread/tss.hpp>
#include <boost/thread.hpp>
#include <unistd.h>
#include <iostream>
using namespace std;

boost::thread_specific_ptr<unsigned long> *pptr = NULL;

void do1() {
    cout << "Creating TLS index\n";
    pptr = new boost::thread_specific_ptr<unsigned long>;
    sleep(5);

    cout << "Replacing TLD index\n";
    delete pptr;
    pptr = new boost::thread_specific_ptr<unsigned long>;
}


void printval() {
    unsigned long * val = pptr->get();
    if (val == NULL) {
        cout << "Got NULL value\n";
        val = new unsigned long(42);
        pptr->reset(val);
    } else {
        cout << "Got value: " << *val << endl;
    }
}

void do2() {
    for (int i = 0; i < 4; i++) {
        sleep(2);
        printval();
    }
}

int main(int argc, char *argv[]) {
    boost::thread t1(do1);
    boost::thread t2(do2);

    t1.join();
    t2.join();

    return 0;
}

OUTPUT:
Creating TLS index
Got NULL value
Got value: 42
Replacing TLD index
Got value: 42
Got value: 42


Добавлена разметка — Кодт
thread_specific_ptr
Re: boost::thread_specific_ptr не обнуляет значение
От: Sni4ok  
Дата: 07.06.09 11:22
Оценка:
Здравствуйте, mgopshtein, Вы писали:

какой ужас, вы хоть чуть чуть почитайте описание что такое что такое конструкторы в c++ ну и о синхронизации тоже заодно, в одной нитке вы создаёте и удаляете обьект, а в другой пытаетесь с ним работать(тоесть вы даже не знаете сконструирован обьект, удаляется и прочее)
boost::thread_specific_ptr нужно конструировать до того как с ним начнут работать разные нитки, ну а после для работы с ним читайте про методы reset и release.
Re[2]: boost::thread_specific_ptr не обнуляет значение
От: mgopshtein  
Дата: 07.06.09 11:54
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>Здравствуйте, mgopshtein, Вы писали:


S>какой ужас, вы хоть чуть чуть почитайте описание что такое что такое конструкторы в c++ ну и о синхронизации тоже заодно, в одной нитке вы создаёте и удаляете обьект, а в другой пытаетесь с ним работать(тоесть вы даже не знаете сконструирован обьект, удаляется и прочее)

S>boost::thread_specific_ptr нужно конструировать до того как с ним начнут работать разные нитки, ну а после для работы с ним читайте про методы reset и release.

Ну так обьект прекрасно создается до начала работаты — синхронизация в примере опущена, а так же не обращаем внимание на memory leaks и т. д. Вопрос был по сути thread_specific_ptr.
Re[3]: boost::thread_specific_ptr не обнуляет значение
От: Sni4ok  
Дата: 07.06.09 14:15
Оценка:
Здравствуйте, mgopshtein, Вы писали:

M>Ну так обьект прекрасно создается до начала работаты — синхронизация в примере опущена, а так же не обращаем внимание на memory leaks и т. д. Вопрос был по сути thread_specific_ptr.


да уж представляю что у вас там за синхронизация, школьное задание делаете?
по сути- создайте глобальный обьект thread_specific_ptr, а далее задавайте значения с помощью метода reset в конкретной нитки.
Re[4]: boost::thread_specific_ptr не обнуляет значение
От: mgopshtein  
Дата: 07.06.09 17:37
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>Здравствуйте, mgopshtein, Вы писали:


S>да уж представляю что у вас там за синхронизация, школьное задание делаете?

S>по сути- создайте глобальный обьект thread_specific_ptr, а далее задавайте значения с помощью метода reset в конкретной нитки.

со школьными звнятиями я уже давно покончил, с синхронизацией тоже справляюсь. Читать документацию умею.

Если интересно по сути, и я плохо объяснил сначала, то вопрос таков — насколько я понимаю, после создания thread_specific_ptr, первый get в каждой нити должен вернуть NULL, пока значение не было задано. На деле есть пример где так не происходит — его я и привел в самом упрощенном виде. Почему? И кто сказал, что thread_specific_ptr всегда глобальный?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.