multithreading - una - variables globales python 3
¿Cómo se accede a las variables globales locales locales en Rust? (1)
Para cada una de las siguientes implementaciones de almacenamiento local de subprocesos, ¿cómo se puede acceder a una variable de subproceso local local en los programas de Rust utilizando los mecanismos ffi estándar expuestos por el compilador o la biblioteca estándar?
- C11
- extensión tls de gcc
- pthreads
- API Windows TLS
Rust tiene una característica nocturna que permite vincular variables locales de hilo externo. La estabilización de la característica se rastrea aquí .
Extensión C11 / GCC TLS
C11 define la palabra clave _Thread_local
para definir la duración del almacenamiento de subprocesos para un objeto. También existe un alias de macro thread_local .
GCC también implementa una extensión Thread Local que usa __thread
como palabra clave.
La vinculación a una C11 _Thread_local
y una gcc __thread
variable es posible usando todas las noches (probado con rustc 1.17.0-nightly (0e7727795 2017-02-19)
y gcc 5.4)
#![feature(thread_local)]
extern crate libc;
use libc::c_int;
#[link(name="test", kind="static")]
extern {
#[thread_local]
static mut test_global: c_int;
}
fn main() {
let mut threads = vec![];
for _ in 0..5 {
let thread = std::thread::spawn(|| {
unsafe {
test_global += 1;
println!("{}", test_global);
test_global += 1;
}
});
threads.push(thread);
}
for thread in threads {
thread.join().unwrap();
}
}
Esto permite obtener acceso a una variable declarada como cualquiera de las siguientes:
_Thread_local extern int test_global;
extern __local int test_global;
La salida del código de Rust anterior será:
1
1
1
1
1
Que se espera, cuando la variable se define como hilo local.