1 2 3 4 5 6 7 | void strcpy(char *dest, char *src) { while (*dest++ = *src++) { ; } *dest = NUL; } |
不可重入型函数的例子如下程序所示。Swap()是一个简单函数,它使函数的两个形式变量的值互换。为便于讨论,假定使用的是可剥夺型内核,中断是开着的,Temp定义为整数全程变量。
1 2 3 4 5 6 7 | int Temp; void swap(int *x, int *y) { Temp = *x; *x = *y; *y = Temp; } |
可重入函数
请注意,这只是一个简单的例子,如何能使代码具有可重入性一看就明白。然而有些情况下,问题并非那么易解。应用程序中的不可重入函数引起的错误很可能在测试时发现不了,直到产品到了现场问题才出现。如果在多任务上您还是把新手,使用不可重入型函数时,千万要当心。
使用以下技术之一即可使Swap()函数具有可重入性:
1. 把Temp定义为局部变量
2. 调用Swap()函数之前关中断,调动后再开中断
3. 用信号量禁止该函数在使用过程中被再次调用
如果中断发生在Swap()函数调用之前或调用之后,两个任务中的X,Y值都会是正确的。