C全局静态 - 在线程之间共享?

jam*_*o00 6 c c++ static multithreading global

在C中,在全局范围内声明变量static使其成为全局变量.这个全局变量是在线程之间共享还是每个线程分配?

更新:如果它们在线程之间共享,那么在预先存在的库中使用对于线程/非共享唯一的简单方法是什么?

Update2:基本上,我需要以线程安全的方式使用带有全局变量的预先存在的C库.

pax*_*blo 16

它对整个过程都是可见的,即所有线程.当然,这是在实践中.从理论上讲,你不能说因为线程与C标准无关(至少达到c99,这是提出这个问题时生效的标准).

但是我用过的所有线程库都会有所有线程都可以访问的全局变量.


更新1:

许多线程库(pthreads,for one)将允许您创建特定于线程的数据,这是一种用于创建和使用特定于线程的数据的函数的方法,而不会通过该函数向下传递.

因此,例如,返回伪随机数的函数可能希望每个线程具有独立的种子.因此,每次调用它时,都会创建或附加到保存该种子的线程特定块(使用某种键).

这允许函数保持与非线程函数相同的签名(例如,如果它们是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) {
        : : :
    }
}
Run Code Online (Sandbox Code Playgroud)

这将允许线程函数被告知数组中的哪个全局变量属于它.

毫无疑问,还有其他方法,但不了解您的目标环境,讨论它们没有多大意义.


更新2:

在线程环境中使用非线程安全库的最简单方法是使用互斥保护提供包装调用.

例如,假设您的库具有非线程安全doThis()功能.你做的是为它提供一个包装:

void myDoThis (a, b) {
    static mutex_t serialize;
    mutex_claim (&serialize);
    doThis (a, b);
    mutex_release (&serialize);
}
Run Code Online (Sandbox Code Playgroud)

会发生什么事情,一次只有一个线程能够声明互斥锁(因此调用非线程安全函数).其他人将被阻止,直到当前的人返回.