Qt的限制和提升线程本地存储

时间:2011-06-28 03:16:22

标签: c++ multithreading qt boost thread-safety

我对QThreadStorage和boost的thread_specific_ptr有以下问题:

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

2)QThreadStorage是否仅适用于QThreads?

3)对升力有没有限制?

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]);
}

1 个答案:

答案 0 :(得分:2)

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

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

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

  3. 在这里,我想你要问的是可以用boost tls存储的对象数量。我不知道对升压有任何限制。你应该没事。

  4. 您的代码对我来说没问题,除非您需要在++glob之前放置互斥锁,否则您可能无法获得递增值。

  5. 我希望这会有所帮助。