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

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

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

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

解决方法

它对整个过程都是可见的,即所有线程.当然,这是在实践中.从理论上讲,你不能说因为线程与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) {
        : : :
    }
}

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

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

更新2:

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

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

void myDoThis (a,b) {
    static mutex_t serialize;
    mutex_claim (&serialize);
    doThis (a,b);
    mutex_release (&serialize);
}

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

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...