TEST17.C
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:2k
源码类别:

操作系统开发

开发平台:

DOS

  1. /**************************************************************************/
  2. /* test17 - shows results of slow message reads                           */
  3. /*          Suppose you have two threads communicating using the messaging*/
  4. /*          functions.  If the reader reads more slowly than the writer   */
  5. /*          sends, soon the message queue will become depleted.           */
  6. /*          Then other operations - like rt_sleep - may be affected as    */
  7. /*          there is no space on the message queue for their messages     */
  8. /*          To demonstrate this, we are using a very small message queue  */
  9. /*          and note that the sender eventually locks in at 5 messages    */
  10. /*          ahead of the sender.  rt_sleep( 200 ) will wait longer than   */
  11. /*          200 ms because sleep has no messages available to inform the  */
  12. /*          sleeping client to wake up.                                   */
  13. /**************************************************************************/
  14. #include "rtos.h"
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. void *peer = NULL;
  18. void switcher1(DWORD arg)
  19. {
  20.     int x;
  21. #if defined(__TURBOC__)||defined(__BORLANDC__)
  22.     randomize();
  23. #else
  24.     srand( time( 0 ) );
  25. #endif
  26.     
  27.     do {
  28.         x = rand();
  29.         cprintf( " sending %u ", x );
  30.         kwritemessage( peer, x, 0 );
  31.         rt_sleep(200);
  32.     } while ( 1 );
  33. }
  34. void switcher2(DWORD arg)
  35. {
  36.     int x;
  37.     DWORD y;
  38.     do {
  39.         if (kgetmessage( &x, &y ) ) {
  40.             cprintf(" read %u rn", x );
  41.             for(y=0; y<=20000000L; y++); // for instance waiting for a serial port answer
  42.             printf("Oo");
  43.         }
  44.      } while ( 1 );
  45. }
  46. main()
  47. {
  48.     kdebug = 1;
  49.     kpreemptive = 1;  // preemtive because switcher2 does not switch away
  50.     rt_init(5);       // a VERY small message queue size to demo this problem
  51.     cputs("starting...rn");
  52.     peer = rt_newthread( switcher2, 2, 4096, 1, "worker2" );
  53.     rt_newthread( switcher1, 1, 4096, 1, "worker1" );
  54.     while ( 1 ) rt_sleep( 10000 );
  55. }