Qt和Boost线程局部存储的限制

4

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

1) QThreadStorage中存储的对象数量是否有限制?我看到一个关于Qt查询256个QThreadStorage对象的问题,想要澄清这个限制指的是什么。

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]);
}
1个回答

2
我可以部分回答你的问题。
1. 256限制属于旧版qt。可能你正在阅读旧版文档。新版qt(即4.6以上)没有这样的限制。
2. QThreadStorage可以在线程退出时销毁包含的项目,因为它与QThread密切配合。因此,在我看来,将它们分开不是一个明智的想法。
3. 在这里,我认为你正在询问可以使用boost tls存储的对象数量。我不知道boost tls有任何限制。你应该没问题。
4. 你的代码看起来没问题,除了data的构造函数中需要在++glob之前放置一个互斥锁,否则你可能无法获得递增的值。
希望这能帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接