home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_02_01 / 2n01012a < prev    next >
Text File  |  1990-10-26  |  2KB  |  94 lines

  1. Figure 2 -- Examples of Deadlocks.
  2.  
  3.  
  4. Section A -- Certain deadlock, double request of same semaphore:
  5.  
  6. long a_sem = 0L;
  7.  
  8. void main( void)
  9. {
  10.   DosSemRequest( &sem_a, SEM_INDEFINITE_WAIT);
  11.   other_func();
  12.   DosSemClear( &sem_a);
  13. }
  14. void other_func(void)
  15. {
  16.   DosSemRequest( &sem_a, SEM_INDEFINITE_WAIT);
  17.   ...     /* can't get to here */
  18.   DosSemClear( &sem_a);
  19. }
  20.  
  21.  
  22. Section B: -- possible deadlock, request semaphores in different
  23. order:
  24.  
  25. void Thread1( void)
  26. {
  27.   DosSemRequest( &sem_a, SEM_INDEFINITE_WAIT);
  28.   DosSemRequest( &sem_b, SEM_INDEFINITE_WAIT);
  29.   DosSemClear( &sem_b);
  30.   DosSemClear( &sem_a);
  31. }
  32.  
  33. void Thread2( void)
  34. {
  35.   DosSemRequest( &sem_b, SEM_INDEFINITE_WAIT);
  36.   DosSemRequest( &sem_a, SEM_INDEFINITE_WAIT);
  37.   DosSemClear( &sem_a);
  38.   DosSemClear( &sem_b);
  39. }
  40.  
  41.  
  42. Section C: -- Italian Traffic Jam:
  43.  
  44. void Thread1( void)
  45. {
  46.   DosSemRequest( &sem_a, SEM_INDEFINITE_WAIT);
  47.   DosSemRequest( &sem_b, SEM_INDEFINITE_WAIT);
  48.   DosSemClear( &sem_b);
  49.   DosSemClear( &sem_a);
  50. }
  51.  
  52. void Thread2( void)
  53. {
  54.   DosSemRequest( &sem_b, SEM_INDEFINITE_WAIT);
  55.   DosSemRequest( &sem_c, SEM_INDEFINITE_WAIT);
  56.   DosSemClear( &sem_c);
  57.   DosSemClear( &sem_b);
  58. }
  59. void Thread3( void)
  60. {
  61.   DosSemRequest( &sem_c, SEM_INDEFINITE_WAIT);
  62.   DosSemRequest( &sem_d, SEM_INDEFINITE_WAIT);
  63.   DosSemClear( &sem_d);
  64.   DosSemClear( &sem_c);
  65. }
  66.  
  67. void Thread4( void)
  68. {
  69.   DosSemRequest( &sem_d, SEM_INDEFINITE_WAIT);
  70.   DosSemRequest( &sem_a, SEM_INDEFINITE_WAIT);
  71.   DosSemClear( &sem_a);
  72.   DosSemClear( &sem_d);
  73. }
  74.  
  75.  
  76. Section D: -- possible deadlock, request semaphore in one thread
  77. and suspend and request in the other:
  78.  
  79. void Thread1( void)
  80. {
  81.   DosSemRequest( &sem_a, SEM_INDEFINITE_WAIT);
  82.   ...
  83.   DosSemClear( &sem_a);
  84. }
  85.  
  86. void Thread2( void)
  87. {
  88.   DosSuspendThread( Thread_ID_1);
  89.   DosSemRequest( &sem_a, SEM_INDEFINITE_WAIT);
  90.   ...
  91.   DosSemClear( &sem_a);
  92. }
  93.  
  94.