win_thread.hpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. //
  2. // win_thread.cpp
  3. // threadpp
  4. //
  5. // Created by Melo Yao on 1/15/15.
  6. // Copyright (c) 2015 Melo Yao. All rights reserved.
  7. //
  8. #ifndef __threadpp__win_thread__hpp__
  9. #define __threadpp__win_thread__hpp__
  10. #include "../threadpp_assert.h"
  11. #if NO_CRT
  12. #else
  13. #include <process.h>
  14. #endif
  15. namespace threadpp
  16. {
  17. inline win_thread::id_type win_thread::null_id()
  18. {
  19. return 0;
  20. }
  21. inline win_thread::handle_t win_thread::win_fp_delegate(void *context)
  22. {
  23. win_context* wctx = static_cast<win_context*>(context);
  24. wctx->fp(wctx->context);
  25. return 0;
  26. }
  27. inline win_thread::win_thread(runnable r,void* t)
  28. {
  29. _context.fp = r;
  30. _context.context = t;
  31. #if NO_CRT
  32. _handle = CreateThread(NULL,NULL,win_thread::win_fp_delegate,&_context,0,&_thread_id);
  33. #else
  34. _handle = (HANDLE)_beginthreadex(NULL,0,win_thread::win_fp_delegate,&_context,0,&_thread_id);
  35. #endif
  36. }
  37. inline win_thread::~win_thread()
  38. {
  39. ASSERT(_handle == 0,"%s","must join or detach a thread before destructing it");
  40. }
  41. inline void win_thread::join()
  42. {
  43. unsigned code = WaitForSingleObject(_handle,0xFFFFFFFF);
  44. CloseHandle(_handle);
  45. _handle = 0;
  46. ASSERT(code == WAIT_OBJECT_0 || code == WAIT_ABANDONED, "failed to join,error:%d",code);
  47. }
  48. inline void win_thread::detach()
  49. {
  50. CloseHandle(_handle);
  51. _handle = 0;
  52. }
  53. inline bool win_thread::is_equal(const win_thread& t) const
  54. {
  55. return _thread_id == t._thread_id;
  56. }
  57. inline void win_thread::sleep(unsigned long millisecs)
  58. {
  59. Sleep(millisecs);
  60. }
  61. inline win_thread::id_type win_thread::get_id() const
  62. {
  63. return static_cast<unsigned int>(_thread_id);
  64. }
  65. inline win_thread::id_type win_thread::current_thread_id()
  66. {
  67. return static_cast<unsigned int>(GetCurrentThreadId());
  68. }
  69. }
  70. #endif