线程变量
在C语言中,如果函数使用的变量或内存均为栈变量,则函数可以充分保证线程的并行执行,但栈变量的生命周期却很短,无法广泛适用于并行编程的指导建议!
如果你想每个线程使用的变量或存储区域,在内存分配上类似栈,每个线程使用时为独立内存,但变量生命周期又类似到静态变量可以长期存在,那么将可以在很大程度上避免全局变量或静态变量的线程安全问题,如果有这种需求,线程变量将是利器!
// linux platform static __thread int s_abBuf[256]; void f() { //some code using s_abBuf ... }
唯一存在的多线程弱点,就是不同函数,在同一个线程内的重入 问题,需要避免,其它将很方便!
const char* formatTypeToStr(TypeVale a)
{
static __thread abBuf[256];
//第一次使用初始化,也能够
//some code using sp_abBuf
...
return abBuf;
}
// invalid usage ,will print the last value in storage !!!
printf("Type1 Name:%s",Type2 Name:%s\n", formatTypeToStr(type1), formatTypeToStr(type2))
另外一个线程变量使用上惯用法,线程变量不允许占用段内存区域过多。如果存在因为线程变量使用,而导致程序无法使用的异常,那么可以用变量的指针作为线程变量,但存储区域放入无限量供应的堆区!
static __thread int* sp_abBuf;
void f()
{
//第一次使用初始化,也能够保证线程安全
if(sp_abBuf == NULL)
{
sp_abBuf = malloc(BIG_SIZE);
}
//some code using sp_abBuf
...
}
结束语
在c++中也对应提供了thread_local的变量声明类型,如果有对应多线程并行编程的使用场景,也可以尽情使用!