我刚在Mac上安装了Rust并rustc --version --verbose显示
rustc 1.0.0-nightly (91bdf23f5 2015-03-09) (built 2015-03-08)
binary: rustc
commit-hash: 91bdf23f504f79ed59617cde3dfebd3d5e39a476
commit-date: 2015-03-09
build-date: 2015-03-08
host: x86_64-apple-darwin
release: 1.0.0-nightly
Run Code Online (Sandbox Code Playgroud)
我克隆了几个存储库(postgres-extension和erlang-rust-nif)并在cargo build它们上面运行.两人都报告了错误
error: could not exec the linker `cc`: No such file or directory (os error 2)
error: aborting due to previous error
Run Code Online (Sandbox Code Playgroud)
另外,我无法"hello world"使用rustc 编译简单的Rust文件打印.我只能通过传递标志来编译它们rustc -C linker=gcc hello_world.rs.
clang --version 显示器
clang version 3.4.2 (http://llvm.org/git/llvm.git 5c6aa738fb3325ae499454877f1e2926d2368135)
Target: x86_64-apple-darwin12.2.1
Thread model: posix
Run Code Online (Sandbox Code Playgroud)
gcc --version 显示器
gcc (Homebrew …Run Code Online (Sandbox Code Playgroud) 我打算使用NIF操作二进制文件用于我计划在Erlang中编码的应用程序.下面给出了指向cpp文件的gist链接和NIF的erl文件.
[Erl Gist Link] https://gist.github.com/abhijitiitr/3a5bc97184d6dd32f97b
[C++ Gist Link] https://gist.github.com/abhijitiitr/24d2b780f2cdacebfb07
基本上我正在尝试做一个简单的测试.在NIF调用之间共享二进制文件,并使用连续的NIF调用成功操作它们.
如果你在erlang REPL中测试代码
c(binary_test).
Ref=binary_test:open(<<1>>).
binary_test:increment(Ref,<<3>>).
Run Code Online (Sandbox Code Playgroud)
存储的二进制文件在NIF调用之间发生变化.第三个命令的REPL输出是
1
3
60
60
<<"?">>
Run Code Online (Sandbox Code Playgroud)
我<<1>>在初始化阶段通过了.它为什么改为<<60>>?我无法弄清楚这里发生了什么.有人可以指出错误吗?
C++编译指令
clang++ -std=c++11 -stdlib=libc++ -undefined dynamic_lookup -O3 -dynamiclib binary_test.cpp -o binary_test.so -I /usr/local/Cellar/erlang/17.0/lib/erlang/erts-6.0/include/
Run Code Online (Sandbox Code Playgroud)
在我的Mac上.
此外,我想问一下在NIF中操作共享资源的并发进程.这是可能的还是有一个规则,即必须在单个Erlang进程中访问NIF.
我观察到C NIF的阻塞行为,当它们被许多Erlang进程同时调用时.可以做成非阻塞吗?这里有mutex工作,我无法理解吗?
PS一个基本的"Hello world"NIF可以通过在特定调用它的情况下使其成为sleep一百来进行测试.可以观察到,调用NIF的其他PID等待该睡眠在执行之前执行.microsecondsPID
在并发可能不会造成问题的情况下(例如,数组推送,计数器增量),非阻塞行为将是有益的.
我共享链接至4个要旨,其包含的spawner,conc_nif_caller和niftest分别模块.我试图修改价值,Val我确实观察到了非阻塞行为.通过为spawn_multiple_nif_callers函数指定一个大整数参数来确认这一点.
链接 spawner.erl,conc_nif_caller.erl,niftest.erl,最后是niftest.c.
下面的行由我的Mac上的Erlang REPL打印.
Erlang/OTP 17 [erts-6.0] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Run Code Online (Sandbox Code Playgroud) c ×2
erlang ×2
erlang-nif ×2
c++11 ×1
concurrency ×1
erlang-shell ×1
linker ×1
macos ×1
rust ×1
rust-cargo ×1