semaphore.3
上传用户:shtangtang
上传日期:2007-01-04
资源大小:167k
文件大小:5k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. ." Copyright (c) 1999-2000 Orn E. Hansen <oe.hansen@gamma.telenordia.se>
  2. ."
  3. ." Permission is granted to make and distribute verbatim copies of this
  4. ." manual provided the copyright notice and this permission notice are
  5. ." preserved on all copies.
  6. ."
  7. ." Permission is granted to copy and distribute modified versions of this
  8. ." manual under the conditions for verbatim copying, provided that the
  9. ." entire resulting derived work is distributed under the terms of a
  10. ." permission notice identical to this one
  11. ."                                                                            
  12. .TH THREADS 3 "10 Feb 2000" "Threads 2.0" "Threads C++ Library"
  13. .SH NAME
  14. semaphore - A class, for process synchronisation.
  15. .SH SYNOPSIS
  16. .B        #include <thread.h>
  17. .sp 2
  18. .B        ....
  19. .sp 0
  20. .B        semaphore sem(attributes::process_private);
  21. ,so 0
  22. .B        ....
  23. .SH DESCRIPTION
  24. The
  25. .I semaphore
  26. class is a part of the threads C++ library that focuses on
  27. simplifying program threading.
  28. The semaphore class is a complete class, that provides the primitive
  29. method of semaphore synchronisation of processes.  It can work in
  30. a shared, as well as local environment.
  31. Semaphores can be created using either
  32. .I attributes::process_shared
  33. initialisation or
  34. .I attributes::process_private
  35. each of which will give it a different working scope.  In a shared
  36. environment, the scope of the semaphore, is open to all processes
  37. who have permission and address it at equal resource identification.
  38. A semaphore, is a class that initially has a count of zero and where
  39. other processes or threads, can wait until it enters a state of 
  40. non zero.  Thus synchronizing the state of the waiting process
  41. with the one posting the value to the semaphore.  A few methods
  42. are provided to create this functionality.
  43. .LP
  44. These methods are listed here, with some explanation on how they
  45. function.
  46. .TP 12
  47. .B post()
  48. This will post incriment the count of the semaphore, by one.  If any
  49. processes are waiting on the semaphore, when its state is updated, they
  50. will be awakened.
  51. .TP 12
  52. .B wait()
  53. Wait for the semaphore to reach a value of non-zero, and then decriment
  54. its count by one.  Return the actual count of the semaphore, upon return.
  55. .TP 12
  56. .B trywait()
  57. This will evaluate the state of the semaphore, and if it is non-zero
  58. the semaphore will be decremented by one.  In each case, the process
  59. will return immediately with the actual semaphore count.  A value of
  60. -1 means, that the semaphore is already at zero.
  61. .LP
  62. In a shared environment, it may be desired that semaphore
  63. resources be addressed differently from other resources belonging
  64. to a process.
  65. .TP 12
  66. .B project_part(const char *)
  67. Give all resources that are of type semaphore, a name
  68. that identifies them seperately, yet still branched from the
  69. main process.  The passed arguement is a branch name, that will
  70. identify all created semaphores.  This is a static
  71. method, that will apply to all semaphores created after
  72. the call.
  73. .LP
  74. Maybe the most useful case for a semaphore, is in the initalization
  75. of a threaded class.
  76. One should note, that a threaded class will upon creation run its
  77. initalization method and the
  78. .I thread(void *)
  79. method at the same time.  This will mean, that upon start some 
  80. variables that will be initialized in the constructor are not
  81. available at the beginning of the thread.  To make the thread
  82. actually wait for the constructor, a
  83. .I semaphore
  84. is a good choice.  A simple example follows:
  85. .nf
  86.        #include <thread.h>
  87.        class mythread : public pthread {
  88.          private:
  89.             semaphore sem;
  90.             int variable;
  91.          public:
  92.            mythread() {
  93.              variable = <some value>;
  94.              sem.post();     // Last instruction in constructor
  95.          };
  96.          ~mythread() { };
  97.          int thread(void *) {
  98.            sem.wait();       // wait for constructor
  99.            // variables are now initialized
  100.          }
  101.        }
  102. .fi
  103. .LP
  104. In the above example, the thread has secured that its local variables
  105. are initialized before it continues its processing.  In many cases, the
  106. thread doesn't need any global variables, it may be using local
  107. variables that it doesn't want to share.  In this case, the user may
  108. want the thread to run off immediately, where the above method
  109. is redunant.
  110. But in many cases, there are several variables that will be shared
  111. between threads.  In these cases, synchronized access to these
  112. variables are a necessity for a successful operation.
  113. .LP
  114. Suggestions and questions about the threads library should be
  115. directed to
  116. .IP
  117. kdb-list@brevet.nu
  118. .LP
  119. Ir, to the specified author below. The threads home page is located at:
  120. .IP
  121. http://user.tninet.se/~dpn659b/threads.html
  122. .LP
  123. .SH AUTHOR
  124. Version 2.0
  125. Copyright (C) 1999-2000 Orn E. Hansen <oe.hansen@gamma.telenordia.se>.
  126. .LP
  127. Thanks to those who reported their suggestions on how to
  128. improve the threads library.