Swedish Institute of Computer Science的Adam Dunkels写的模拟解决生产者-消费者问题的C语言代码,在这个文件包里主要的文件有pt.h,pt-sem.h,lc.h,lc-switch.h,lc-addrlabel.h,详细请看http://www.sics.se/~adam/pt/pt-1.4-refman/main.html。接下来,我将我对这些代码的一些想法描述。
3.1.1 信号量
信号量的编写主要在pt-sem.h里完成的。
1、 信号量数据结构的定义
struct pt_sem {
unsigned int count;
};
count就是此信号量的值。
2、 信号量的初始化
#define PT_SEM_INIT(s, c) (s)->count = c
s是一个指向该信号量的指针,而c是该信号量初始化的值。
3、 信号量等待
#define PT_SEM_WAIT(pt, s) /
do { /
PT_WAIT_UNTIL(pt, (s)->count > 0); /
--(s)->count; /
} while(0)
pt是一个指向线程数据结构的指针,s是一个指向该信号量的指针。为了看懂这个程序还需明白PT_WAIT_UNTIL:
#define PT_WAIT_UNTIL(pt, condition) /
do { /
LC_SET((pt)->lc); /
if(!(condition)) { /
return PT_WAITING; /
} /
} while(0)
因此,可知,当(s)->count > 0成立时,即!(condition)不成立,则一直执行PT_WAIT_UNTIL;知道当(s)->count > 0不成立时,则!(condition)成立,则返回PT_WAITING状态,并将(s)->count减1。
4、 信号量增加
#define PT_SEM_SIGNAL(pt, s) ++(s)->count
pt和s和上述的pt和s具有相同的性质。此时将(s)->count加1,由PT_SEM_WAIT程序可知,只有当(s)->count的值变为大于等于0,线程才继续执行。
3.1.2 线程
1、 线程数据结构的定义
struct pt {