Add multithreading example #1

Open
aniva wants to merge 2 commits from multithreading into main
5 changed files with 56 additions and 13 deletions

View File

@ -1,3 +1,5 @@
import Lean
@[export my_function] @[export my_function]
def my_function (s: String): String := def my_function (s: String): String :=
s ++ s!" at callee" s ++ s!" at callee"

1
Callee/lean-toolchain Normal file
View File

@ -0,0 +1 @@
leanprover/lean4:nightly-2024-03-27

View File

@ -38,19 +38,20 @@
"flake-utils": "flake-utils", "flake-utils": "flake-utils",
"lean4-mode": "lean4-mode", "lean4-mode": "lean4-mode",
"nix": "nix", "nix": "nix",
"nixpkgs": "nixpkgs_2" "nixpkgs": "nixpkgs_2",
"nixpkgs-old": "nixpkgs-old"
}, },
"locked": { "locked": {
"lastModified": 1695693562, "lastModified": 1711508550,
"narHash": "sha256-6qbCafG0bL5KxQt2gL6hV4PFDsEMM0UXfldeOOqxsaE=", "narHash": "sha256-UK4DnYmwXLcqHA316Zkn0cnujdYlxqUf+b6S4l56Q3s=",
"owner": "leanprover", "owner": "leanprover",
"repo": "lean4", "repo": "lean4",
"rev": "a832f398b80a5ebb820d27b9e55ec949759043ff", "rev": "b4caee80a3dfc5c9619d88b16c40cc3db90da4e2",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "leanprover", "owner": "leanprover",
"ref": "v4.1.0", "ref": "b4caee80a3dfc5c9619d88b16c40cc3db90da4e2",
"repo": "lean4", "repo": "lean4",
"type": "github" "type": "github"
} }
@ -141,6 +142,23 @@
"type": "github" "type": "github"
} }
}, },
"nixpkgs-old": {
"flake": false,
"locked": {
"lastModified": 1581379743,
"narHash": "sha256-i1XCn9rKuLjvCdu2UeXKzGLF6IuQePQKFt4hEKRU5oc=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "34c7eb7545d155cc5b6f499b23a7cb1c96ab4d59",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-19.03",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-regression": { "nixpkgs-regression": {
"locked": { "locked": {
"lastModified": 1643052045, "lastModified": 1643052045,

View File

@ -4,7 +4,7 @@
inputs = { inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
flake-parts.url = "github:hercules-ci/flake-parts"; flake-parts.url = "github:hercules-ci/flake-parts";
lean.url = "github:leanprover/lean4?ref=v4.1.0"; lean.url = "github:leanprover/lean4?ref=b4caee80a3dfc5c9619d88b16c40cc3db90da4e2";
rust-crate2nix = { rust-crate2nix = {
url = "github:kolloch/crate2nix"; url = "github:kolloch/crate2nix";
flake = false; flake = false;

View File

@ -6,10 +6,16 @@ mod lean {
include!(concat!(env!("OUT_DIR"), "/lean.rs")); include!(concat!(env!("OUT_DIR"), "/lean.rs"));
#[link(name = "leanshared")] #[link(name = "leanshared")]
#[link(name = "Init_shared")]
#[link(name = "leanrt")]
extern "C" { extern "C" {
pub fn lean_initialize_runtime_module(); pub fn lean_initialize_runtime_module();
pub fn lean_initialize(); pub fn lean_initialize();
// lean_io_mark_end_initialization is already defined. // lean_io_mark_end_initialization is already defined.
#[link_name = "lean_initialize_thread"]
pub fn initialize_thread();
#[link_name = "lean_finalize_thread"]
pub fn finalize_thread();
} }
} }
@ -119,8 +125,7 @@ fn call_think(s: &str) -> Result<String, usize> {
} }
} }
fn call_print_in_upper() fn call_print_in_upper() {
{
let c_str = std::ffi::CString::new("caller").unwrap(); let c_str = std::ffi::CString::new("caller").unwrap();
unsafe { unsafe {
let native_str = lean::lean_mk_string(c_str.as_ptr()); let native_str = lean::lean_mk_string(c_str.as_ptr());
@ -139,10 +144,27 @@ fn main() {
initialize(); initialize();
println!("Lean initialization complete!"); println!("Lean initialization complete!");
call_my_function(); use std::{
call_stylize(); sync::{Arc, Barrier},
thread,
};
assert_eq!(call_think("Stanford"), Ok("tanford".to_string())); let threads: usize = 10;
assert_eq!(call_think("Else"), Err(4));
call_print_in_upper(); let mut handles = Vec::with_capacity(threads);
let barrier = Arc::new(Barrier::new(threads));
for _ in 0..threads {
let barrier = barrier.clone();
handles.push(thread::spawn(move || {
unsafe { lean::initialize_thread() };
barrier.wait();
call_my_function();
call_stylize();
call_print_in_upper();
unsafe { lean::finalize_thread() };
}))
}
for handle in handles {
handle.join().unwrap();
}
} }