рдЧреЛ рд╕реЗ рд░рд╕реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмреБрд▓рд╛рдУ

рдПрдХ рд╕рдордп рдореЗрдВ, рд╣реЗрдм рдкрд░ рдПрдХ рд▓реЗрдЦ рдерд╛ рдХрд┐ рдЧреЛ рд╕реЗ рд░рд╕реНрдЯ рдХреЛрдб рдХреЛ рдХреИрд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП ред рд▓реЗрдЦ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рдордЭрдиреЗ рдореЗрдВ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛрдиреЛрдВ рднрд╛рд╖рд╛рдУрдВ рдХреА рдУрд░ рджреЗрдЦрдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╕реЗ рд╢реБрд░реБрдЖрддреА рдХреЛ рдкреАрдЫреЗ рдХрд░ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдкреЛрд╕реНрдЯ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХреНрд░реЙрд╕-рд▓реИрдВрдЧреНрд╡реЗрдЬ рдХреЙрд▓ рдХреА рдЪрдкреЗрдЯ рдореЗрдВ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЫрд╡рд┐

рд╣рдо рдмрд╣реБрдд рджреВрд░ рдирд╣реАрдВ рдЧрдП рдФрд░ рд░рд╕реНрдЯ рднрд╛рд╖рд╛ рд╕реАрдЦрдиреЗ рдкрд░ рдПрдХ рдХрд┐рддрд╛рдм рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓реЗрддреЗ рд╣реИрдВред

рдпрд╣ рд╕рднреА рдЙрджрд╛рд╣рд░рдг 10 рд╕реВрддреНрд░ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рднреАрддрд░ рдпрд╣ рдЪрд░ 'x' рдХреЛ 5 рдорд┐рд▓рд┐рдпрди рддрдХ рдмрдврд╝рд╛рддрд╛ рд╣реИ рдФрд░ рдзрд╛рд░рд╛ рдХреЗ рдЕрдВрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

use std::thread;

#[no_mangle]
pub extern "C" fn process() {
    let handles:Vec<_> = (0..10).map(|_|{
        thread::spawn(||{
            let mut x = 0;
            for _ in 0..5_000_000 {
                x += 1
            }
            x
        })
    }).collect();

    for h in handles {
        println!("Thread finished with count={}",
                 h.join().map_err(|_| "Could not join thread!").unwrap());
    }
    println!("Done!");
}


рдЖрдкрдХреЛ рдХрд╛рд░реНрдЧреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЗрд╕рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рдХрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдЯреЛрдХрд░рд╛-рдкреНрд░рдХрд╛рд░ = ["cdylib"]
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдлреЙрд░реЗрди рдлрдВрдХреНрд╢рди рдЗрдВрдЯрд░рдлреЗрд╕ (рдПрдлрдПрдлрдЖрдИ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ ред

рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ libembed.dylib рдореИрдХ рдУрдПрд╕ рдкрд░ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рд▓рд┐рдирдХреНрд╕ рдкрд░ рдпрд╣ libembed.so рд╣реЛрдЧрд╛, рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдпрд╣ libembed.dll рд╣реЛрдЧрд╛ред

рдзрдиреНрдпрд╡рд╛рдж: bingo347


Cargo.toml
[package]
name = "embed"
version = "0.1.0"

[lib]
crate-type = ["cdylib"]


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдЖрдкрдХреЛ рд░реБрд╕реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкреБрд╕реНрддрдХ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдо рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдВрдЧреЗред

рд╣рдо рдЖрджреЗрд╢ рдХреЗ рд╕рд╛рде рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
рдХрд╛рд░реНрдЧреЛ рдмрд┐рд▓реНрдб - рдмреИрд░рд▓
рдЕрдм рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЧреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИред рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдВрджрд░, рд╡рд╣ рд▓рд┐рдмрд░ рдлреЛрд▓реНрдбрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо /target/release/libembed.dylib рдлрд╛рдЗрд▓ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ ред рдЕрдВрджрд░, рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдХреЙрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред

lib / process.h
void process();


рдЧреЛ-рдлрд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ рд╣рдо рдРрд╕реЗ рдирд┐рд░реНрджреЗрд╢ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░рд╛ main.go рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛

package main

/*
#cgo LDFLAGS: -L./lib -lembed
#include "./lib/process.h"
*/
import "C"

func main() {
	C.process()
}


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛
go build -ldflags = "- r / lib" main.go
Ldflags рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рд╕рднреА рдИрдПрд▓рдПрдл рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓рд┐рдВрдХрд░ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рддрдп рдХрд░рддреЗ рд╣реИрдВред

рд╕рдмред рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдПрдВ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред



рдпрд╣ рднреА рдЕрд▓рдЧ рд╕реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЖрдк рдЧреЛ-рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рд╢рд┐рдХреНрд╖рд╛рдУрдВ рдХреЛ рд░рд╕реНрдЯ-рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд░рд╕реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рд▓реЗред

extern crate libc;
use std::thread;
use std::ffi::CStr;

#[no_mangle]
pub extern "C" fn process(name: *const libc::c_char) {

    let buf_name = unsafe { CStr::from_ptr(name).to_bytes() };
    let str_name = String::from_utf8(buf_name.to_vec()).unwrap();

    let handles:Vec<_> = (0..10).map(|_|{
        thread::spawn(||{
            let mut x = 0;
            for _ in 0..5_000_000 {
                x += 1
            }
            x
        })
    }).collect();

    for h in handles {
        println!("{}:Thread finished with count={}\n",
                 str_name,
                 h.join().map_err(|_| "Could not join thread!\n").unwrap());
    }
    println!("Done!");
}


рд╣рдо рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ, рд▓рд╛рдпрдмреНрд░реЗрд░реА рдХреЛ рдлрд┐рд░ рд╕реЗ lib рдлреЛрд▓реНрдбрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рддрд░рд╣ рд╕реЗ process.h рдлрд╛рдЗрд▓ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рд╢реВрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ (рдЪрд╛рд░ * рдирд╛рдо);

рд╣рдо рдЧреЛ-рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рд▓рд╛рдЗрди рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ: "рдЧреЛрд▓рдВрдЧ рд╕реЗ рд╣реИрд▓реЛ") ред

package main

/*
#cgo LDFLAGS: -L./lib -lembed
#include "./lib/process.h"
*/
import "C"

func main() {
	C.process(C.CString("Hello from Golang !!"))
}


рд╕рдмред рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдПрдВ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред


All Articles