回答
:TlsAlloc()/TlsSetValue()/ TlsGetValue()
在Windows使用编译器的内部:在Linux(其他POSIX使用_declspec(thread)
? ??):get_thread_area()和相关的
在MSDN上阅读后,Tls函数正是我所期待的。 –
你忘了TlsFree :-) –
当前的C标准的螺纹或类似的模型没有一个答案,所以你无法得到答案,在那里。
POSIX预见的效用是pthread_[gs]etspecific
。
C标准的下一个版本增加了线程,并具有线程本地存储的概念。
您可以为每个线程创建从堆中分配的数据结构。
示例:在Windows上使用Windows API
struct ThreadLocal
{
int var1;
float var2;
//etc..
}
只需在你的函数中使用static和__thread。
例子:
int test(void)
{
static __thread a;
return a++;
}
是__thread标准吗? –
@Ali:不,它是由GCC和其他一些编译器提供的扩展。在MSVC上,我认为你应该使用'__declspec(thread)'。 –
__thread适用于linux,bsd,aix,以及xl_c,gcc和许多其他编译器。它可以平凡#defined到__declspec(线程)在Windows上。 –
你可以让自己的线程特定的本地存储为每个线程ID单。类似这样的:
struct ThreadLocalStorage
{
ThreadLocalStorage()
{
// initialization here
}
int my_static_variable_1;
// more variables
};
class StorageManager
{
std::map<int, ThreadLocalStorage *> m_storages;
~StorageManager()
{ // storage cleanup
std::map<int, ThreadLocalStorage *>::iterator it;
for(it = m_storages.begin(); it != m_storages.end(); ++it)
delete it->second;
}
ThreadLocalStorage * getStorage()
{
int thread_id = GetThreadId();
if(m_storages.find(thread_id) == m_storages.end())
{
m_storages[thread_id] = new ThreadLocalStorage;
}
return m_storages[thread_id];
}
public:
static ThreadLocalStorage * threadLocalStorage()
{
static StorageManager instance;
return instance.getStorage();
}
};
GetThreadId();是用于确定调用者的线程ID的平台特定功能。事情是这样的:现在
int GetThreadId()
{
int id;
#ifdef linux
id = (int)gettid();
#else // windows
id = (int)GetCurrentThreadId();
#endif
return id;
}
,线程函数中,你可以使用它的本地存储:
void threadFunction(void*)
{
StorageManager::threadLocalStorage()->my_static_variable_1 = 5; //every thread will have
// his own instance of local storage.
}
您还需要同步(例如读/写互斥)来保护'm_storages'免受多线程访问。当然是 –
。你是对的。 – GreenScape
不仅是m_storages,还有std :: map和本地“静态StorageManager实例”不是线程安全的。 在本地代码中实现高效单例并不是一件容易的事情,请参阅Scott Meyers和Andrei Alexandrescu的“C++和双重检查锁定的危险”。 http://erdani.com/publications/DDJ_Jul_Aug_2004_revised.pdf – zhaorufei
您也可以使用C++ 11线程本地存储的添加,如果你有机会到C++ 11。
- 1. 如何动态定义局部变量
- 2. 静态全局变量和静态局部变量
- 3. 静态局部变量的线程安全增量
- 4. 静态确定Python局部变量?
- 5. 静态局部变量和静态局部对象初始化
- 6. 静态方法和线程安全的局部变量
- 7. 静态局部变量何时出现?
- 8. C#线程静态变量
- 9. Python静态线程变量
- 10. matlab本地静态变量
- 11. 使用本地静态std :: once_flag和本地静态指针的线程安全初始化静态变量
- 12. 线程局部变量
- 13. 全局与局部静态变量的shell环境变量
- 14. 静态局部变量C99静态内联函数
- 15. 如何在Java中创建静态局部变量?
- 16. 使用key-callback读取线程局部变量的静态哈希表
- 17. 我怎么能有非静态线程局部变量为每个实例
- 18. 使用线程递增静态变量
- 19. 符号表本地静态变量名
- 20. 全局静态变量不是“保持定义”功能之外
- 21. 自定义静态布局
- 22. 如何访问动态局部变量
- 23. 线程拷贝的局部变量
- 24. Kotlin局部变量线程安全
- 25. 保持并行线程局部变量
- 26. 装配 - 线程安全局部变量
- 27. 初始化线程局部变量
- 28. C#局部变量和多线程
- 29. C++多线程安全局部变量?
- 30. 定义全局变量在C局部变量
你在使用什么操作系统? TLS在unixen和windows之间不可移植。 – bdonlan
C++ 11引入了另一个称为['thread_local']的存储持续时间(http://en.cppreference.com/w/cpp/language/storage_duration)。尝试使用它。 – Nawaz
操作系统是Windows ... –