2011-06-28 42 views
4

我有以下的QThreadStorage问题和提升的thread_specific_ptr:限制对Qt和升压线程本地存储

1)是否有可存储在Qthreadstorage对象的数量有何限制?我遇到了一个关于256个QThreadStorage对象的qt查询,所以想澄清这个限制指向什么?

2)QThreadStorage是否仅适用于QThreads?

3)boost tls有没有限制?

4)我有一个用例,我想在tls上进行操作,并在所有线程完成进一步处理时将数据同步到主线程。我写了下面的代码,并且想检查下面的代码是否可以。

#include <iostream> 
#include <boost/thread/thread.hpp> 
#include <boost/thread/tss.hpp> 

boost::mutex mutex1; 
int glob = 0; 

class data 
{ 
    public: 
    char* p; 
    data() 
    { 
      p = (char*)malloc(10); 
     sprintf(p, "test%d\n", ++glob); 
    } 
}; 

char* global_p[11] = {0}; 
int index = -1; 

void cleanup(data* _ignored) { 
    std::cout << "TLS cleanup" << std::endl; 
boost::mutex::scoped_lock lock(mutex1); 
global_p[++index] = _ignored->p; 
} 



boost::thread_specific_ptr<data> value(cleanup); 

void thread_proc() 
{ 
    value.reset(new data()); // initialize the thread's storage 
std::cout << "here" << std::endl; 
} 

int main(int argc, char* argv[]) 
{ 
    boost::thread_group threads; 
    for (int i=0; i<10; ++i) 
     threads.create_thread(&thread_proc); 
    threads.join_all(); 

    for (int i=0; i<10; ++i) 
     puts(global_p[i]); 
} 

回答

2

我可以部分回答你的问题。

  1. 256限制属于 QT。可能你正在阅读旧文档。新的qt版本(即4.6以上)没有这样的限制

  2. QThreadStorage可以销毁线程退出包含的项目,因为它与QThread密切合作。因此,在我看来,分离这两个并不是一个明智的想法。

  3. 在这里,我认为你问的是可以用boost tls存储的对象的数量。我不知道有什么限制提升tls。你应该没问题。

  4. 您的代码对我来说看起来没问题,除非在数据的构造函数中需要在++glob之前加上互斥锁,否则您可能无法获得递增值。

我希望这有助于。