FAQ
上传用户:zhenyu
上传日期:2022-04-24
资源大小:268k
文件大小:15k
源码类别:

视频捕捉/采集

开发平台:

Visual C++

  1.   =========================================
  2.   PTHREADS-WIN32 Frequently Asked Questions
  3.   =========================================
  4. INDEX
  5. -----
  6. Q 1 What is it?
  7. Q 2 Which of the several dll versions do I use?
  8. or,
  9. What are all these pthread*.dll and pthread*.lib files?
  10. Q 3 What is the library naming convention?
  11. Q 4 Cleanup code default style or: it used to work when I built
  12. the library myself, but now it doesn't - why?
  13. Q 5 Why is the default library version now less exception-friendly?
  14. Q 6 Should I use Cygwin or Mingw32 as a development environment?
  15. Q 7 Now that pthreads-win32 builds under Mingw32, why do I get
  16. memory access violations (segfaults)?
  17. Q 8 How do I use pthread.dll for Win32 (Visual C++ 5.0)
  18. Q 9 Cancelation doesn't work for me, why?
  19. Q 10 How do I generate pthreadGCE.dll and libpthreadw32.a for use
  20. with Mingw32?
  21. =============================================================================
  22. Q 1 What is it?
  23. ---
  24. Pthreads-win32 is an Open Source Software implementation of the
  25. Threads component of the POSIX 1003.1c 1995 Standard for Microsoft's
  26. Win32 environment. Some functions from POSIX 1003.1b are also
  27. supported including semaphores. Other related functions include
  28. the set of read-write lock functions. The library also supports
  29. some of the functionality of the Open Group's Single Unix
  30. specification, version 2, namely mutex types.
  31. See the file "ANNOUNCE" for more information including standards
  32. conformance details and list of supported routines.
  33. ------------------------------------------------------------------------------
  34. Q 2 Which of the several dll versions do I use?
  35. --- or,
  36. What are all these pthread*.dll and pthread*.lib files?
  37. Simply, you only use one of them, but you need to choose carefully.
  38. The most important choice you need to make is whether to use a
  39. version that uses exceptions internally, or not (there are versions
  40. of the library that use exceptions as part of the thread
  41. cancelation and cleanup implementation, and one that uses
  42. setjmp/longjmp instead).
  43. There is some contension amongst POSIX threads experts as
  44. to how POSIX threads cancelation and exit should work
  45. with languages that include exceptions and handlers, e.g.
  46. C++ and even C (Microsoft's Structured Exceptions).
  47. The issue is: should cancelation of a thread in, say,
  48. a C++ application cause object destructors and C++ exception
  49. handlers to be invoked as the stack unwinds during thread
  50. exit, or not?
  51. There seems to be more opinion in favour of using the
  52. standard C version of the library (no EH) with C++ applications
  53. since this appears to be the assumption commercial pthreads
  54. implementations make. Therefore, if you use an EH version
  55. of pthreads-win32 then you may be under the illusion that
  56. your application will be portable, when in fact it is likely to
  57. behave very differently linked with other pthreads libraries.
  58. Now you may be asking: why have you kept the EH versions of
  59. the library?
  60. There are a couple of reasons:
  61. - there is division amongst the experts and so the code may
  62.   be needed in the future. (Yes, it's in the repository and we
  63.   can get it out anytime in the future, but ...)
  64. - pthreads-win32 is one of the few implementations, and possibly
  65.   the only freely available one, that has EH versions. It may be
  66.   useful to people who want to play with or study application
  67.   behaviour under these conditions.
  68. ------------------------------------------------------------------------------
  69. Q 3 What is the library naming convention?
  70. ---
  71. Because the library is being built using various exception
  72. handling schemes and compilers - and because the library
  73. may not work reliably if these are mixed in an application,
  74. each different version of the library has it's own name.
  75. Note 1: the incompatibility is really between EH implementations
  76. of the different compilers. It should be possible to use the
  77. standard C version from either compiler with C++ applications
  78. built with a different compiler. If you use an EH version of
  79. the library, then you must use the same compiler for the
  80. application. This is another complication and dependency that
  81. can be avoided by using only the standard C library version.
  82. Note 2: if you use a standard C pthread*.dll with a C++
  83. application, then any functions that you define that are
  84. intended to be called via pthread_cleanup_push() must be
  85. __cdecl.
  86. Note 3: the intention is to also name either the VC or GC
  87. version (it should be arbitrary) as pthread.dll, including
  88. pthread.lib and libpthread.a as appropriate.
  89. In general:
  90. pthread[VG]{SE,CE,C}.dll
  91. pthread[VG]{SE,CE,C}.lib
  92. where:
  93. [VG] indicates the compiler
  94. V - MS VC
  95. G - GNU C
  96. {SE,CE,C} indicates the exception handling scheme
  97. SE - Structured EH
  98. CE - C++ EH
  99. C - no exceptions - uses setjmp/longjmp
  100. For example:
  101. pthreadVSE.dll (MSVC/SEH)
  102. pthreadGCE.dll (GNUC/C++ EH)
  103. pthreadGC.dll (GNUC/not dependent on exceptions)
  104. The GNU library archive file names have changed to:
  105. libpthreadGCE.a
  106. libpthreadGC.a
  107. ------------------------------------------------------------------------------
  108. Q 4 Cleanup code default style or: it used to work when I built
  109. --- the library myself, but now it doesn't - why?
  110. Up to and including snapshot 2001-07-12, if not defined, the cleanup
  111. style was determined automatically from the compiler used, and one
  112. of the following was defined accordingly:
  113. __CLEANUP_SEH MSVC only
  114. __CLEANUP_CXX C++, including MSVC++, GNU G++
  115. __CLEANUP_C C, including GNU GCC, not MSVC
  116. These defines determine the style of cleanup (see pthread.h) and,
  117. most importantly, the way that cancelation and thread exit (via
  118. pthread_exit) is performed (see the routine ptw32_throw() in private.c).
  119. In short, the exceptions versions of the library throw an exception
  120. when a thread is canceled or exits (via pthread_exit()), which is
  121. caught by a handler in the thread startup routine, so that the
  122. the correct stack unwinding occurs regardless of where the thread
  123. is when it's canceled or exits via pthread_exit().
  124. After snapshot 2001-07-12, unless your build explicitly defines (e.g.
  125. via a compiler option) __CLEANUP_SEH, __CLEANUP_CXX, or __CLEANUP_C, then
  126. the build now ALWAYS defaults to __CLEANUP_C style cleanup. This style
  127. uses setjmp/longjmp in the cancelation and pthread_exit implementations,
  128. and therefore won't do stack unwinding even when linked to applications
  129. that have it (e.g. C++ apps). This is for consistency with most/all
  130. commercial Unix POSIX threads implementations.
  131. Although it was not clearly documented before, it is still necessary to
  132. build your application using the same __CLEANUP_* define as was
  133. used for the version of the library that you link with, so that the
  134. correct parts of pthread.h are included. That is, the possible
  135. defines require the following library versions:
  136. __CLEANUP_SEH pthreadVSE.dll
  137. __CLEANUP_CXX pthreadVCE.dll or pthreadGCE.dll
  138. __CLEANUP_C pthreadVC.dll or pthreadGC.dll
  139. THE POINT OF ALL THIS IS: if you have not been defining one of these
  140. explicitly, then the defaults have been set according to the compiler
  141. and language you are using, as described at the top of this
  142. section.
  143. THIS NOW CHANGES, as has been explained above. For example:
  144. If you were building your application with MSVC++ i.e. using C++
  145. exceptions (rather than SEH) and not explicitly defining one of
  146. __CLEANUP_*, then __CLEANUP_C++ was defined for you in pthread.h.
  147. You should have been linking with pthreadVCE.dll, which does
  148. stack unwinding.
  149. If you now build your application as you had before, pthread.h will now
  150. set __CLEANUP_C as the default style, and you will need to link
  151. with pthreadVC.dll. Stack unwinding will now NOT occur when a
  152. thread is canceled, nor when the thread calls pthread_exit().
  153. Your application will now most likely behave differently to previous
  154. versions, and in non-obvious ways. Most likely is that local
  155. objects may not be destroyed or cleaned up after a thread
  156. is canceled.
  157. If you want the same behaviour as before, then you must now define
  158. __CLEANUP_C++ explicitly using a compiler option and link with
  159. pthreadVCE.dll as you did before.
  160. ------------------------------------------------------------------------------
  161. Q 5 Why is the default library version now less exception-friendly?
  162. ---
  163. Because most commercial Unix POSIX threads implementations don't allow you to
  164. choose to have stack unwinding. (Compaq's TRU64 Unix is possibly an exception.)
  165. Therefore, providing it in pthread-win32 as a default could be dangerous
  166. and non-portable. We still provide the choice but you must now consciously
  167. make it.
  168. WHY NOT REMOVE THE EXCEPTIONS VERSIONS OF THE LIBRARY ALTOGETHER?
  169. There are a few reasons:
  170. - because there are well respected POSIX threads people who believe
  171.   that POSIX threads implementations should be exceptions-aware and
  172.   do the expected thing in that context. (There are equally respected
  173.   people who believe it should not be easily accessible, if it's there
  174.   at all.)
  175. - because pthreads-win32 is one of the few implementations that has
  176.   the choice, perhaps the only freely available one, and so offers
  177.   a laboratory to people who may want to explore the effects;
  178. - although the code will always be around somewhere for anyone who
  179.   wants it, once it's removed from the current version it will not be
  180.   nearly as visible to people who may have a use for it.
  181. ------------------------------------------------------------------------------
  182. Q 6 Should I use Cygwin or Mingw32 as a development environment?
  183. ---
  184. Important: see Q7 also.
  185. Use Mingw32 with the MSVCRT library to build applications that use
  186. the pthreads DLL.
  187. Cygwin's own internal support for POSIX threads is growing.
  188. Consult that project's documentation for more information.
  189. ------------------------------------------------------------------------------
  190. Q 7 Now that pthreads-win32 builds under Mingw32, why do I get
  191. --- memory access violations (segfaults)?
  192. The latest Mingw32 package has thread-safe exception handling (see Q10).
  193. Also, see Q6 above.
  194. ------------------------------------------------------------------------------
  195. Q 8 How do I use pthread.dll for Win32 (Visual C++ 5.0)
  196. ---
  197. >
  198. > I'm a "rookie" when it comes to your pthread implementation. I'm currently
  199. > desperately trying to install the prebuilt .dll file into my MSVC compiler.
  200. > Could you please provide me with explicit instructions on how to do this (or
  201. > direct me to a resource(s) where I can acquire such information)?
  202. >
  203. > Thank you,
  204. >
  205. You should have a .dll, .lib, .def, and three .h files. It is recommended
  206. that you use pthreadVC.dll, rather than pthreadVCE.dll or pthreadVSE.dll
  207. (see Q2 above).
  208. The .dll can go in any directory listed in your PATH environment
  209. variable, so putting it into C:WINDOWS should work.
  210. The .lib file can go in any directory listed in your LIB environment
  211. variable.
  212. The .h files can go in any directory listed in your INCLUDE
  213. environment variable.
  214. Or you might prefer to put the .lib and .h files into a new directory
  215. and add its path to LIB and INCLUDE. You can probably do this easiest
  216. by editing the file:-
  217. C:Program FilesDevStudiovcbinvcvars32.bat
  218. The .def file isn't used by anything in the pre-compiled version but 
  219. is included for information.
  220. Cheers.
  221. Ross
  222. ------------------------------------------------------------------------------
  223. Q 9 Cancelation doesn't work for me, why?
  224. ---
  225. > I'm investigating a problem regarding thread cancelation. The thread I want
  226. > to cancel has PTHREAD_CANCEL_ASYNCHRONOUS, however, this piece of code
  227. > blocks on the join():
  228. >
  229. > if ((retv = Pthread_cancel( recvThread )) == 0)
  230. > {
  231. > retv = Pthread_join( recvThread, 0 );
  232. > }
  233. >
  234. > Pthread_* are just macro's; they call pthread_*.
  235. >
  236. > The thread recvThread seems to block on a select() call. It doesn't get
  237. > cancelled.
  238. >
  239. > Two questions:
  240. >
  241. > 1) is this normal behaviour?
  242. >
  243. > 2) if not, how does the cancel mechanism work? I'm not very familliar to
  244. > win32 programming, so I don't really understand how the *Event() family of
  245. > calls work.
  246. The answer to your first question is, normal POSIX behaviour would  
  247. be to asynchronously cancel the thread. However, even that doesn't
  248. guarantee cancelation as the standard only says it should be
  249. cancelled as soon as possible.
  250. Snapshot 99-11-02 or earlier only partially supports asynchronous cancellation.
  251. Snapshots since then simulate async cancelation by poking the address of
  252. a cancelation routine into the PC of the threads context. This requires
  253. the thread to be resumed in some way for the cancelation to actually
  254. proceed. This is not true async cancelation, but it is as close as we've
  255. been able to get to it.
  256. If the thread you're trying to cancel is blocked (for instance, it could be
  257. waiting for data from the network), it will only get cancelled when it unblocks
  258. (when the data arrives). For true pre-emptive cancelation in these cases,
  259. pthreads-win32 from snapshot 2004-05-16 can automatically recognise and use the
  260. QueueUserAPCEx package by Panagiotis E. Hadjidoukas. This package is available
  261. from the pthreads-win32 ftp site and is included in the pthreads-win32
  262. self-unpacking zip from 2004-05-16 onwards.
  263. Using deferred cancelation would normally be the way to go, however,
  264. even though the POSIX threads standard lists a number of C library
  265. functions that are defined as deferred cancelation points, there is
  266. no hookup between those which are provided by Windows and the
  267. pthreads-win32 library.
  268. Incidently, it's worth noting for code portability that the older POSIX
  269. threads standards cancelation point lists didn't include "select" because
  270. (as I read in Butenhof) it wasn't part of POSIX. However, it does appear in
  271. the SUSV3.
  272. Effectively, the only mandatory cancelation points that pthreads-win32
  273. recognises are those the library implements itself, ie.
  274. pthread_testcancel
  275. pthread_cond_wait
  276. pthread_cond_timedwait
  277. pthread_join
  278. sem_wait
  279. sem_timedwait
  280. pthread_delay_np
  281. The following routines from the non-mandatory list in SUSV3 are
  282. cancelation points in pthreads-win32:
  283. pthread_rwlock_wrlock
  284. pthread_rwlock_timedwrlock
  285. The following routines from the non-mandatory list in SUSV3 are not
  286. cancelation points in pthreads-win32:
  287. pthread_rwlock_rdlock
  288. pthread_rwlock_timedrdlock
  289. Pthreads-win32 also provides two functions that allow you to create
  290. cancelation points within your application, but only for cases where
  291. a thread is going to block on a Win32 handle. These are:
  292. pthreadCancelableWait(HANDLE waitHandle) /* Infinite wait */
  293.  
  294. pthreadCancelableTimedWait(HANDLE waitHandle, DWORD timeout)
  295. ------------------------------------------------------------------------------
  296.  
  297. Q 10 How do I create thread-safe applications using
  298. ---- pthreadGCE.dll, libpthreadw32.a and Mingw32?
  299. This should not be a problem with recent versions of MinGW32.
  300. For early versions, see Thomas Pfaff's email at:
  301. http://sources.redhat.com/ml/pthreads-win32/2002/msg00000.html
  302. ------------------------------------------------------------------------------
  303.