mysql在windows平台下线程同步的实现方式

  今天在看mysqlslap源码的时候,发现mysqlslap里面对于线程的同步使用的是pthread_mutex_t,pthread_cond_t等,这不是linux下的东西吗?怎么在windows下也能这样使用 。难道这是C的库函数 。为了确认一下,自己建了一个工程,声明变量pthread_mutex_t MyMutex,hi,该类型居然不能够被识别。包含了几个C的库进来还是不行。于是对mysqlslap中的该类型进行了到底的追踪。

最后发现该类型被定义于 MySQL的my_pthread.h头文件中。如:

typedef CRITICAL_SECTION pthread_mutex_t;

该文件明确说了,其这样的目的是为了实现向linux中的posix线程。该说明位置在my_pthread.h的实现文件中。

在my_winthread.c中的原话是:

/*****************************************************************************

** Simulation of posix threads calls for Windows

*****************************************************************************/

相似的还有

typedef DWORD pthread_t;

typedef struct thread_attr {

    DWORD dwStackSize ;

    DWORD dwCreatingFlag ;

} pthread_attr_t ;

typedef struct { int dummy; } pthread_condattr_t;
/* Implementation of posix conditions */
typedef struct st_pthread_link {
  DWORD thread_id;
  struct st_pthread_link *next;
} pthread_link;
/**
  Implementation of Windows condition variables.
  We use native conditions on Vista and later, and fallback to own 
  implementation on earlier OS version.
*/
typedef union
{
  /* Native condition (used on Vista and later) */
  CONDITION_VARIABLE native_cond;
  /* Own implementation (used on XP) */
  struct
  { 
    uint32 waiting;
    CRITICAL_SECTION lock_waiting;
    enum 
    {
      SIGNAL= 0,
      BROADCAST= 1,
      MAX_EVENTS= 2
    } EVENTS;
    HANDLE events[MAX_EVENTS];
    HANDLE broadcast_block_event;
  };
} pthread_cond_t;
typedef int pthread_mutexattr_t;
#define pthread_self() GetCurrentThreadId()
#define pthread_handler_t EXTERNC void * __cdecl
typedef void * (__cdecl *pthread_handler)(void *);
typedef volatile LONG my_pthread_once_t;
#define MY_PTHREAD_ONCE_INIT  0
#define MY_PTHREAD_ONCE_INPROGRESS 1
#define MY_PTHREAD_ONCE_DONE 2
/*
  Struct and macros to be used in combination with the
  windows implementation of pthread_cond_timedwait
*/
/*
   Declare a union to make sure FILETIME is properly aligned
   so it can be used directly as a 64 bit value. The value
   stored is in 100ns units.
 */
 union ft64 {
  FILETIME ft;
  __int64 i64;
 };
struct timespec {
  union ft64 tv;
  /* The max timeout value in millisecond for pthread_cond_timedwait */
  long max_timeout_msec;
};
#define set_timespec(ABSTIME,SEC) { /
  GetSystemTimeAsFileTime(&((ABSTIME).tv.ft)); /
  (ABSTIME).tv.i64+= (__int64)(SEC)*10000000; /
  (ABSTIME).max_timeout_msec= (long)((SEC)*1000); /
}
#define set_timespec_nsec(ABSTIME,NSEC) { /
  GetSystemTimeAsFileTime(&((ABSTIME).tv.ft)); /
  (ABSTIME).tv.i64+= (__int64)(NSEC)/100; /
  (ABSTIME).max_timeout_msec= (long)((NSEC)/1000000); /
}
上面这些都是对实现线程同步时定义的一些结构和宏。MySQL为了在使用上和linux一样。于是后面定义处理函数的名称的时候,也完全按linux下相应的功能来进行命名的。真是够费心的了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值