Es visible para todo el proceso, es decir, todos los hilos. Por supuesto, esto es en la práctica. En teoría, no se podría decir porque los hilos no tienen nada que ver con el estándar C (al menos hasta c99, que es el estándar que estaba en vigor cuando se formuló esta pregunta).
Pero todas las bibliotecas de hilos que he usado tendrían acceso global a todos los hilos.
Actualización 1:
Muchas bibliotecas de hebras (threads, por ejemplo) le permitirá crear datos de hilos específica, un medio para funciones para crear y utilizar los datos específicos de la rosca sin tener pasó a través de la función.
Así que, por ejemplo, una función para devolver números pseudoaleatorios puede querer que cada subproceso tenga una semilla independiente. Así que cada vez que se lo llama o bien crea o se conecta a un bloque específico de subprocesos que contiene esa semilla (usando algún tipo de clave).
Esto permite que las funciones mantengan la misma firma que las no roscadas (importante si son funciones ISO C por ejemplo) ya que la otra solución implica agregar un puntero específico de hilo a la llamada a la función.
Otra posibilidad es tener un conjunto de variables globales de los cuales cada hilo obtiene uno, tales como:
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) {
: : :
}
}
Esto permitiría a la función del hilo que se les diga qué variable global en la matriz pertenece a ella .
Existen otros métodos, sin duda, pero a falta de conocer su entorno objetivo, no tiene mucho sentido discutirlos.
Actualización 2:
La manera más fácil utilizar una biblioteca no seguro para subprocesos en un entorno roscado es proporcionar llamadas envoltorio con protección mutex.
Por ejemplo, supongamos que su biblioteca tiene una función doThis()
no segura para subprocesos. Lo que se hace es proporcionar un contenedor para que:
void myDoThis (a, b) {
static mutex_t serialize;
mutex_claim (&serialize);
doThis (a, b);
mutex_release (&serialize);
}
lo que sucederá es que hay sólo un hilo a la vez será capaz de reclamar la exclusión mutua (y por tanto llamar a la función no-thread-safe). Otros serán bloqueados hasta que regrese el actual.
Declarar una variable estática lo convierte en una variable de alcance de archivo. Declararlo no estático lo hace global. –
Gracias por esa aclaración. – jameszhao00
¿Qué sistema operativo usas? Creo que podría haber una solución específica de plataforma para Update2. –