生产者消费者函数:
voidtsk_producer(void*pv){ }
voidtsk_consumer(void*pv){ }
while(1) { }
task_exit(0);
sem_wait(full);//还有产品么? sem_wait(mutex); inti;
for(i=0;i<=arrayNumber-1;i++) { }
sem_signal(mutex);//让出临界区使生产与消费并行 sort_m(temp[count],arrayNumber,count*230); //冒泡排序
resetAllBK(temp[count],arrayNumber,count*230); //清空该缓冲区 count=(++count)%N;
sem_signal(empty);//消费完一个产品
temp[count][i]=array[count][i];
while(1) { }
task_exit(0);
inti=0;
srand((unsigned)time(NULL)); sem_wait(empty);//是否有空闲位置? sem_wait(mutex);
for(i=0;i<=arrayNumber-1;i++) { }
startposition=(++startposition)%N; sem_signal(mutex);
sem_signal(full);//有产品生产好
array[startposition][i]=random() 0;
draw(i*10,startposition*230,startposition*230+array[startposition][i]); DELAY(100000);
主函数:
intvalue=1;
intsetResult1=setpriority(tid_producer,2); intsetResult2=setpriority(tid_consumer,2);
inttid_producer=task_create(stack_producer+1024*1024,tsk_producer,(void*)0); inttid_consumer=task_create(stack_consumer+1024*1024,tsk_consumer,(void*)0); unsignedchar*stack_producer=(unsignedchar*)malloc(1024*1024); unsignedchar*stack_consumer=(unsignedchar*)malloc(1024*1024); initGraphics(0x0118); value=N;
empty=sem_create(value); value=0;
full=sem_create(value); mutex=sem_create(value);
五、实验结果及分析(实现的效果,包括屏幕截图、系统总体运行情况和测试情况等)
intsetResult1=setpriority(tid_producer,2); intsetResult2=setpriority(tid_consumer,2);
inttid_producer=task_create(stack_producer+1024*1024,tsk_producer,(void*)0); inttid_consumer=task_create(stack_consumer+1024*1024,tsk_consumer,(void*)0); unsignedchar*stack_producer=(unsignedchar*)malloc(1024*1024); unsignedchar*stack_consumer=(unsignedchar*)malloc(1024*1024); initGraphics(0x0118); empty=sem_create(value);
五、实验结果及分析(实现的效果,包括屏幕截图、系统总体运行情况和测试情况等)
通过互斥量保护Setpixel解决了实验二优先级调度的花屏现象 通过做本实验,我对书本上信号量概念有了实践性的理解