最近在学并发开发, 里面需要用到Promela语言来检测代码的逻辑
Promela用起来很麻烦, 不过网上有个Windows GUI程序, 里面还带了很多例子代码, 稍微看看就可以懂了
工具名称叫JSpin, 在这里下载
https://code.google.com/p/jspin/
安装起来很简单, 安装好之后, 打开安装目录下的config文件, 吧Mingw路径配置好就可以了.
打开程序运行, 随便找个示例代码跑下, 如果编译不成功, 那么就在他的Run.bat前面加上这行
SET PATH=%path%;c:/path_of_mingw/bin
你可以在安装目录下找到用户手册jspin-user.pdf
一般检测并发代码需要检测下面三项
1.互斥(Mutual exclusion)
2.无死锁(Free from Deadlock)
3.无饥饿(Free from starvation)
在这个工具里面, 你可以用assert()来进行检测, 也可以自己写LTL(线性时间逻辑)来检测,
你可以打开里面的 dekker.pml 学习下如何使用它们来检测
pml语言的语法略奇葩,不过看看就会, active proctype 就是声明一个线程
/* Dekker's algorithm */
bool wantp = false, wantq = false;
byte turn = 1;
bool csp = false, csq = false;
ltl { []<>csp && []<>csq }
active proctype p() {
do
:: wantp = true;
do
:: !wantq -> break;
:: else ->
if
:: (turn == 1)
:: (turn == 2) ->
wantp = false;
(turn == 1);
wantp = true
fi
od;
csp = true;
assert (!(csp && csq));
csp = false;
wantp = false;
turn = 2
od
}
active proctype q() {
do
:: wantq = true;
do
:: !wantp -> break;
:: else ->
if
:: (turn == 2)
:: (turn == 1) ->
wantq = false;
(turn == 2);
wantq = true
fi
od;
csq = true;
assert (!(csp && csq));
csq = false;
wantq = false;
turn = 1
od
}
线性时间逻辑就是在逻辑的基础上加上了时间的概念, []表示永远是1, <>表示在未来终究会出现1 等等
http://web.iitd.ac.in/~sumeet/slide3.pdf
https://www.youtube.com/watch?v=KVQdTjvtyUw