Qt和boost线程本地存储的限制
Limitation on Qt and boost thread local storage
我对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]);
}
我可以部分回答您的问题。
-
256限值属于旧qt。可能您正在阅读旧文档。新qt版本(即4.6以上)没有这样的限制
-
QThreadStorage可以在线程出口销毁包含的项,因为它与QThread密切合作。所以在我看来,把这两者分开不是一个明智的主意。
-
在这里,我认为您正在询问可以使用boost-tls存储的对象的数量。我不知道boost tls有任何限制。你应该没事的。
-
您的代码在我看来还可以,只是在数据的构造函数中,您需要在
++glob
之前放置一个互斥锁,否则您可能无法获得递增值。
我希望这能有所帮助。
相关文章:
- Boost program_options将多个配置文件解析结果存储到一个parsed_options中
- 如何使用 boost::future 重新抛出 std::exception_ptr 存储的原始异常?
- 如何将 time-uuid(存储在 boost uuid 中)转换为时间戳/自纪元以来的时间?
- 在可变参数模板函数中存储参数而不使用 boost::any
- 如何将 JSON 键值(我使用 cpp boost 解析)存储在相关数据结构中?
- Cmake忽略了我所有关于在boost::beast存储库中在哪里找到提升的指令
- 为什么使用 Boost.Intrusive 容器来存储多态对象是可以的?
- 使用 boost program_options时,如何确保声明具有C++的存储类或类型说明符?
- Boost::p roperty_tree:在XML解析器中使用std::vector<>在一个键中存储多个值
- 使用非连接存储(即!= vecs)和add_Edge()的最小boost aidgacency_list
- Boost::序列化存储结构时的堆栈溢出错误
- 从 C 字符串构造 boost::type_erasure::any,但存储为 std::string
- 将 STL 映射存储到 Boost ConstBufferSequence 中
- 我可以使用 boost::bind 来存储不相关的对象吗?
- 确实 boost::any / std::any 将小对象存储到位
- 命令行参数未存储(使用 boost)
- 存储Boost Multi_index索引迭代器
- (C )将lambda函数存储在Boost Multi_Array中
- BOOST :: Gregorian ::日期在内部存储日期
- 无法在 std::map 中存储 boost::bind 函数