2016-03-07 51 views
0

的所有instaces我只是用thread_local分享我的对象在其下部模块显示相同的数据。但它总是取最后一个实例的对象数据。线程本地为对象

代码:

Test1.h

class Test2; 
extern thread_local void* currentpointer; 
class Test1 
{ 
public: 
    Test1(int val); 
    void display() ; 

    Test2 *obj; 

private: 
    int temp; 
}; 

Test1.cpp

thread_local void* currentpointer=nullptr; 

Test1::Test1(int val) 
{ 
    currentpointer = this; 
    obj = new Test2; 
    temp = val; 
} 
void Test1::display() 
{ 
    qDebug()<<Q_FUNC_INFO<<temp; 
} 

Test2.h

class Test2 
{ 
public: 
    Test2(); 
    void display(); 
}; 

测试2.cpp

Test2::Test2() 
{ 
} 
void Test2::display() 
{ 
    ((Test1*)currentpointer)->display(); 
} 

的main.cpp

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Test1 obj1(100); 
    Test1 obj2(200); 
    Test1 obj3(300); 

    obj1.obj->display(); 
    obj2.obj->display(); 
    obj3.obj->display(); 

    return a.exec(); 
} 

响应:

空隙测试1 ::显示()300

空隙测试1 ::显示()300

空隙测试1: :显示器()300

我在这里做了什么错,有人可以帮我解决这个问题。

+4

呃...你没有任何线程? (好吧,1,'main()'线程)。 – BoBTFish

回答

1

按此顺序

Test1 obj1(100); 
Test1 obj2(200); 
Test1 obj3(300); 

Test1::obj让你每个Test1的对象的Test2对象PTR创建对象。

void Test2::display() 
{ 
    ((Test1*)currentpointer)->display(); 
} 

返回currentpointer静态变量

currentpointer得到每个Time1构造函数被调用时设置

Test1::Test1(int val) 
{ 
    currentpointer = this; 
    obj = new Test2; 
    temp = val; 
} 

所以基本上你的代码可以完美运行,静态变量的逻辑只是让

obj1.obj->display(); 
obj2.obj->display(); 
obj3.obj->display(); 

返回相同的对象,从而显示相同的字符串

+0

thread_local应该维护线程特定的信息。我期待它显示100,200,300,但为什么它显示300,300,300 – Jeggu

+0

你的对象都在同一个线程中,上面说明的所有内容 – Zaiborg

+0

@srinivas'thread_local'为每个线程创建一个副本。在你的情况下,你只有一个线程,所以当你调用'currentpointer = this;'时,你只需用新的值覆盖旧的值。 – thuga