在 C 中,在全局范围内声明一个变量 static 使其成为一个全局变量。这个全局变量是在线程之间共享还是为每个线程分配?
更新: 如果它们在线程之间共享,有什么简单的方法可以使预先存在的库中的全局变量对于线程/非共享是唯一的?
更新2: 基本上,我需要以线程安全的方式将预先存在的 C 库与全局变量一起使用。
最佳答案
它对整个进程可见,即 所有 线程。当然,这是在实践中。理论上,你不能说,因为线程与 C 标准无关(至少到 c99,这是提出这个问题时生效的标准)。
但我曾经使用过的所有线程库都具有可供所有线程访问的全局变量。
更新 1:
许多线程库(例如 pthreads)将允许您创建特定于线程的数据,这是函数创建和使用特定于线程的数据而无需通过函数向下传递的一种方法。
因此,例如,一个返回伪随机数的函数可能希望每个线程都有一个独立的种子。因此,每次调用它时,它都会创建或附加到一个特定于线程的 block ,该 block 包含该种子(使用某种 key )。
这允许函数保持与非线程函数相同的签名(例如,如果它们是 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) {
: : :
}
}
这将允许线程函数被告知数组中的哪个全局变量属于它。
毫无疑问,还有其他方法,但如果不了解您的目标环境,讨论这些方法没有太大意义。
更新 2:
在线程环境中使用非线程安全库的最简单方法是为包装器调用提供互斥保护。
例如,假设您的库有一个非线程安全的 doThis()
函数。您要做的是为其提供一个包装器:
void myDoThis (a, b) {
static mutex_t serialize;
mutex_claim (&serialize);
doThis (a, b);
mutex_release (&serialize);
}
将会发生的情况是一次只有一个线程能够申请互斥体(并因此调用非线程安全函数)。其他人将被阻止,直到当前的返回。
关于c++ - C 全局静态 - 在线程之间共享?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1338846/