vxWroks中一个有关互斥的程序
我看到一个程序,
/*include*/
#include "vxWorks.h"
#include "taskLib.h"
#include "semLib.h"
#include "stdio.h"
/*function prototype*/
void taskOne(void);
void taskTwo(void);
/* global */
#define ITER 10
SEM_ID semBinary;
int global = 0;
void binary(void)
{
int taskIdOne, taskIdTwo;
/* create semphore with available and queue tasks on FIFO basis */
semBinary = semBCreate(SEM_Q_FIFO, SEM_FULL);
/* ----------------NOTE 1--------------*/
semTake(semBinary, WAIT_FOREVER);
/* spawn the two tasks */
taskIdOne = taskSpawn("t1", 90, 0x100, 2000, (FUNCPTR)taskOne, 0,0,0,0,0,0,0,0,0,0);
taskIdTwo = taskSpawn("t2", 90, 0x100, 2000, (FUNCPTR)taskTwo, 0,0,0,0,0,0,0,0,0,0);
}
void taskOne(void)
{
int i;
for (i=0; i<ITER; i++)
{
semTake(semBinary, WAIT_FOREVER);
/* wait indefinitely for semphore */
printf(" I am taskOne and global = %d ...\n", ++global);
semGive(semBinary); /* give up semphore */
}
}
void taskTwo(void)
{
int i;
/*-------------NOTE 2--------------*/
semGive(semBinary); /* give up the semphore and begin the switch */
for (i=0; i<ITER; i++)
{
semTake(semBinary, WAIT_FOREVER);
printf(" I am taskTwo and global = %d ----\n", --lobal);
semGive(semBinary); /* give up semphore */
}
}
这个程序的结果自然是global在1和0之间变化,任务1和任务2不断切换。
但是如果删除上述程序中的注释NOTE1和NOTE2下面的两句,结果是什么呢?我觉得结果不变,但是运行结果是:任务1结束(也就是说循环10次,使得global增加到10),然后才是任务2,global从10减少到0.
我很不理解,任务1semGive之后,任务2应该可以取得信号呀!?