zoukankan      html  css  js  c++  java
  • win32 pthread库源码阅读

    #include "pthread.h"
    #include "implement.h"
    
    
    int
    pthread_attr_init (pthread_attr_t * attr)
         /*
          * ------------------------------------------------------
          * DOCPUBLIC
          *      Initializes a thread attributes object with default
          *      attributes.
          *
          * PARAMETERS
          *      attr
          *              pointer to an instance of pthread_attr_t
          *
          *
          * DESCRIPTION
          *      Initializes a thread attributes object with default
          *      attributes.
          *
          *      NOTES:
          *              1)      Used to define thread attributes
          *
          * RESULTS
          *              0               successfully initialized attr,
          *              ENOMEM          insufficient memory for attr.
          *
          * ------------------------------------------------------
          */
    {
      pthread_attr_t attr_result;
    
      if (attr == NULL)
        {
          /* This is disallowed. */
          return EINVAL;
        }
    
      attr_result = (pthread_attr_t) malloc (sizeof (*attr_result));
    
      if (attr_result == NULL)
        {
          return ENOMEM;
        }
    
    #ifdef _POSIX_THREAD_ATTR_STACKSIZE
      /*
       * Default to zero size. Unless changed explicitly this
       * will allow Win32 to set the size to that of the
       * main thread.
       */
      attr_result->stacksize = 0;
    #endif
    
    #ifdef _POSIX_THREAD_ATTR_STACKADDR
      /* FIXME: Set this to something sensible when we support it. */
      attr_result->stackaddr = NULL;
    #endif
    
    // 设置线程默认是怎么退出的 attr_result->detachstate = PTHREAD_CREATE_JOINABLE; #if HAVE_SIGSET_T memset (&(attr_result->sigmask), 0, sizeof (sigset_t)); #endif /* HAVE_SIGSET_T */ /* * Win32 sets new threads to THREAD_PRIORITY_NORMAL and * not to that of the parent thread. We choose to default to * this arrangement. */ attr_result->param.sched_priority = THREAD_PRIORITY_NORMAL; attr_result->inheritsched = PTHREAD_EXPLICIT_SCHED; attr_result->contentionscope = PTHREAD_SCOPE_SYSTEM; attr_result->valid = PTW32_ATTR_VALID; *attr = attr_result; return 0; }


    #include "pthread.h"
    #include "implement.h"
    #ifndef _UWIN
    #include <process.h>
    #endif
    
    int
    pthread_create (pthread_t * tid,
            const pthread_attr_t * attr,
            void *(*start) (void *), void *arg)
         /*
          * ------------------------------------------------------
          * DOCPUBLIC
          *      This function creates a thread running the start function,
          *      passing it the parameter value, 'arg'. The 'attr'
          *      argument specifies optional creation attributes.
          *      The identity of the new thread is returned
          *      via 'tid', which should not be NULL.
          *
          * PARAMETERS
          *      tid
          *              pointer to an instance of pthread_t
          *
          *      attr
          *              optional pointer to an instance of pthread_attr_t
          *
          *      start
          *              pointer to the starting routine for the new thread
          *
          *      arg
          *              optional parameter passed to 'start'
          *
          *
          * DESCRIPTION
          *      This function creates a thread running the start function,
          *      passing it the parameter value, 'arg'. The 'attr'
          *      argument specifies optional creation attributes.
          *      The identity of the new thread is returned
          *      via 'tid', which should not be the NULL pointer.
          *
          * RESULTS
          *              0               successfully created thread,
          *              EINVAL          attr invalid,
          *              EAGAIN          insufficient resources.
          *
          * ------------------------------------------------------
          */
    {
      pthread_t thread;
      ptw32_thread_t * tp;
      register pthread_attr_t a;
      HANDLE threadH = 0;
      int result = EAGAIN;
      int run = PTW32_TRUE;
      ThreadParms *parms = NULL;
      long stackSize;
      int priority;
      pthread_t self;
    
      /*
       * Before doing anything, check that tid can be stored through
       * without invoking a memory protection error (segfault).
       * Make sure that the assignment below can't be optimised out by the compiler.
       * This is assured by conditionally assigning *tid again at the end.
       */
      tid->x = 0;
    
      if (attr != NULL)
        {
          a = *attr;
        }
      else
        {
          a = NULL;
        }
    
      if ((thread = ptw32_new ()).p == NULL)
        {
          goto FAIL0;
        }
    
      tp = (ptw32_thread_t *) thread.p;
    
      priority = tp->sched_priority;
    
      if ((parms = (ThreadParms *) malloc (sizeof (*parms))) == NULL)
        {
          goto FAIL0;
        }
    
      parms->tid = thread;
      parms->start = start;
      parms->arg = arg;
    
    #if defined(HAVE_SIGSET_T)
    
      /*
       * Threads inherit their initial sigmask from their creator thread.
       */
      self = pthread_self();
      tp->sigmask = ((ptw32_thread_t *)self.p)->sigmask;
    
    #endif /* HAVE_SIGSET_T */
    
    
      if (a != NULL)
        {
          stackSize = a->stacksize;
          tp->detachState = a->detachstate;
          priority = a->param.sched_priority;
    
    #if (THREAD_PRIORITY_LOWEST > THREAD_PRIORITY_NORMAL)
          /* WinCE */
    #else
          /* Everything else */
    
          /*
           * Thread priority must be set to a valid system level
           * without altering the value set by pthread_attr_setschedparam().
           */
    
          /*
           * PTHREAD_EXPLICIT_SCHED is the default because Win32 threads
           * don't inherit their creator's priority. They are started with
           * THREAD_PRIORITY_NORMAL (win32 value). The result of not supplying
           * an 'attr' arg to pthread_create() is equivalent to defaulting to
           * PTHREAD_EXPLICIT_SCHED and priority THREAD_PRIORITY_NORMAL.
           */
          if (PTHREAD_INHERIT_SCHED == a->inheritsched)
        {
          /*
           * If the thread that called pthread_create() is a Win32 thread
           * then the inherited priority could be the result of a temporary
           * system adjustment. This is not the case for POSIX threads.
           */
    #if ! defined(HAVE_SIGSET_T)
          self = pthread_self ();
    #endif
          priority = ((ptw32_thread_t *) self.p)->sched_priority;
        }
    
    #endif
    
        }
      else
        {
          /*
           * Default stackSize
           */
          stackSize = PTHREAD_STACK_MIN;
        }
    
      tp->state = run ? PThreadStateInitial : PThreadStateSuspended;
    
      tp->keys = NULL;
    
      /*
       * Threads must be started in suspended mode and resumed if necessary
       * after _beginthreadex returns us the handle. Otherwise we set up a
       * race condition between the creating and the created threads.
       * Note that we also retain a local copy of the handle for use
       * by us in case thread.p->threadH gets NULLed later but before we've
       * finished with it here.
       */
    
    #if ! defined (__MINGW32__) || defined (__MSVCRT__) || defined (__DMC__) 
    
      tp->threadH =
        threadH =
        (HANDLE) _beginthreadex ((void *) NULL,    /* No security info             */
                     (unsigned) stackSize,    /* default stack size   */
                     ptw32_threadStart,
                     parms,
                     (unsigned)
                     CREATE_SUSPENDED,
                     (unsigned *) &(tp->thread));
    
      if (threadH != 0)
        {
          if (a != NULL)
        {
          (void) ptw32_setthreadpriority (thread, SCHED_OTHER, priority);
        }
    
          if (run)
        {
          ResumeThread (threadH);
        }
        }
    
    #else /* __MINGW32__ && ! __MSVCRT__ */
    
      /*
       * This lock will force pthread_threadStart() to wait until we have
       * the thread handle and have set the priority.
       */
      (void) pthread_mutex_lock (&tp->cancelLock);
    
      tp->threadH =
        threadH =           // 线程创建最终调用了这个函数
        (HANDLE) _beginthread (ptw32_threadStart, (unsigned) stackSize,    /* default stack size   */
                   parms);
    
      /*
       * Make the return code match _beginthreadex's.
       */
      if (threadH == (HANDLE) - 1L)
        {
          tp->threadH = threadH = 0;
        }
      else
        {
          if (!run)
        {
          /* 
           * beginthread does not allow for create flags, so we do it now.
           * Note that beginthread itself creates the thread in SUSPENDED
           * mode, and then calls ResumeThread to start it.
           */
          SuspendThread (threadH);
        }
    
          if (a != NULL)
        {
          (void) ptw32_setthreadpriority (thread, SCHED_OTHER, priority);
        }
        }
    
      (void) pthread_mutex_unlock (&tp->cancelLock);
    
    #endif /* __MINGW32__ && ! __MSVCRT__ */
    
      result = (threadH != 0) ? 0 : EAGAIN;
    
      /*
       * Fall Through Intentionally
       */
    
      /*
       * ------------
       * Failure Code
       * ------------
       */
    
    FAIL0:
      if (result != 0)
        {
    
          ptw32_threadDestroy (thread);
          tp = NULL;
    
          if (parms != NULL)
        {
          free (parms);
        }
        }
      else
        {
          *tid = thread;
        }
    
    #ifdef _UWIN
      if (result == 0)
        pthread_count++;
    #endif
      return (result);
    
    }    

                         一顿操作,最终调用还是#include <process.h> 中一个函数 

      

    一勤天下无难事。
  • 相关阅读:
    [数学建模(八)]使用MATLAB绘图
    [数学建模(七)]使用MATLAB实现数据拟合
    [数学建模(六)]使用MATLAB实现插值
    [数学建模(五)]线性规划,二次规划和非线性规划的MATLAB求解
    [数学建模(四)]MATLAB神经网络工具箱的简单应用
    [数学建模(三)]遗传算法与旅行商问题
    [数学建模(二)模拟退火法与旅行商问题]
    [数学建模(一)]蒙特卡罗方法
    Java虚拟机13:Java类加载机制
    Java虚拟机14:类加载器
  • 原文地址:https://www.cnblogs.com/nowroot/p/12634838.html
Copyright © 2011-2022 走看看