Qt和boost线程本地存储的限制

Limitation on Qt and boost thread local storage

本文关键字:存储 boost 线程 Qt      更新时间:2023-10-16

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

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

2) QThreadStorage是否仅适用于QThread?

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%dn", ++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. 256限值属于qt。可能您正在阅读旧文档。新qt版本(即4.6以上)没有这样的限制

  2. QThreadStorage可以在线程出口销毁包含的项,因为它与QThread密切合作。所以在我看来,把这两者分开不是一个明智的主意。

  3. 在这里,我认为您正在询问可以使用boost-tls存储的对象的数量。我不知道boost tls有任何限制。你应该没事的。

  4. 您的代码在我看来还可以,只是在数据的构造函数中,您需要在++glob之前放置一个互斥锁,否则您可能无法获得递增值。

我希望这能有所帮助。