在C语言中,将变量在全局范围内声明为静态变量会使其成为全局变量。这个全局变量是在线程之间共享的还是每个线程都有自己的分配?如果它们在线程之间共享,那么如何轻松地使预先存在的库中的全局变量对于每个线程都是唯一的/非共享的呢?基本上,我需要以线程安全的方式使用一个预先存在的带有全局变量的C库。
更新1:
许多线程库(例如pthread)允许您创建特定于线程的数据,这是一种函数创建和使用特定于线程的数据而无需将其通过函数传递的方法。
例如,一个返回伪随机数的函数可能希望每个线程都有一个独立的种子。因此,每次调用函数时,它都会创建或附加到保持该种子的线程特定块(使用某种键)。
这允许函数保持与非线程化函数相同的签名(如果它们是ISO C函数,则很重要),因为另一种解决方案涉及向函数调用本身添加特定于线程的指针。
另一个可能性是拥有一个全局变量数组,每个线程获取其中一个,例如:
int fDone[10];
int idx;
: : :
for (i = 0; i < 10; i++) {
idx = i;
startThread (function, i);
while (idx >= 0)
yield();
}
void function () {
int myIdx = idx;
idx = -1;
while (1) {
: : :
}
}
这将允许线程函数知道它所使用的数组中的哪个全局变量属于它。void myDoThis (a, b) {
static mutex_t serialize;
mutex_claim (&serialize);
doThis (a, b);
mutex_release (&serialize);
}
在那里发生的事情是,一次只能有一个线程获取到互斥锁(从而调用非线程安全函数)。其他线程将被阻塞,直到当前线程返回。
C/C++标准不支持线程。因此,所有在线程之间共享的变量。 线程支持是在C/C++运行时库中实现的,该库不是标准的一部分。运行时库对于每个C/C++实现都是特定的。如果您想在C++中编写可移植代码,可以使用boost interprocess library。
要在Microsoft Visual Studio中声明线程本地变量,可以使用Microsoft特定的关键字__declspec( thread )
。