Имеем такой код как приведен внизу. Я ожидал что 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
какой ужас, вы хоть чуть чуть почитайте описание что такое что такое конструкторы в c++ ну и о синхронизации тоже заодно, в одной нитке вы создаёте и удаляете обьект, а в другой пытаетесь с ним работать(тоесть вы даже не знаете сконструирован обьект, удаляется и прочее)
boost::thread_specific_ptr нужно конструировать до того как с ним начнут работать разные нитки, ну а после для работы с ним читайте про методы reset и release.
Re[2]: boost::thread_specific_ptr не обнуляет значение
Здравствуйте, Sni4ok, Вы писали:
S>Здравствуйте, mgopshtein, Вы писали:
S>какой ужас, вы хоть чуть чуть почитайте описание что такое что такое конструкторы в c++ ну и о синхронизации тоже заодно, в одной нитке вы создаёте и удаляете обьект, а в другой пытаетесь с ним работать(тоесть вы даже не знаете сконструирован обьект, удаляется и прочее) S>boost::thread_specific_ptr нужно конструировать до того как с ним начнут работать разные нитки, ну а после для работы с ним читайте про методы reset и release.
Ну так обьект прекрасно создается до начала работаты — синхронизация в примере опущена, а так же не обращаем внимание на memory leaks и т. д. Вопрос был по сути thread_specific_ptr.
Re[3]: boost::thread_specific_ptr не обнуляет значение
Здравствуйте, mgopshtein, Вы писали:
M>Ну так обьект прекрасно создается до начала работаты — синхронизация в примере опущена, а так же не обращаем внимание на memory leaks и т. д. Вопрос был по сути thread_specific_ptr.
да уж представляю что у вас там за синхронизация, школьное задание делаете?
по сути- создайте глобальный обьект thread_specific_ptr, а далее задавайте значения с помощью метода reset в конкретной нитки.
Re[4]: boost::thread_specific_ptr не обнуляет значение
Здравствуйте, Sni4ok, Вы писали:
S>Здравствуйте, mgopshtein, Вы писали:
S>да уж представляю что у вас там за синхронизация, школьное задание делаете? S>по сути- создайте глобальный обьект thread_specific_ptr, а далее задавайте значения с помощью метода reset в конкретной нитки.
со школьными звнятиями я уже давно покончил, с синхронизацией тоже справляюсь. Читать документацию умею.
Если интересно по сути, и я плохо объяснил сначала, то вопрос таков — насколько я понимаю, после создания thread_specific_ptr, первый get в каждой нити должен вернуть NULL, пока значение не было задано. На деле есть пример где так не происходит — его я и привел в самом упрощенном виде. Почему? И кто сказал, что thread_specific_ptr всегда глобальный?