【问题标题】:#define PI_THREAD(X) void *X (void *dummy)#define PI_THREAD(X) void *X (void *dummy)
【发布时间】:2013-10-08 02:57:17
【问题描述】:

这个 PI_THREAD(X) 被定义为 void*X(void * dummy),它是一个有自己名字的函数。返回 void* 和 void* 作为参数。我看不出它与线程有什么关系。

这个宏的用法,

  /*
 * softPwmThread:
 *  Thread to do the actual PWM output
 *********************************************************************************
 */

static PI_THREAD (softPwmThread)
{
  int pin, mark, space ;

  pin    = newPin ;
  newPin = -1 ;

  piHiPri (50) ;

  for (;;)
  {
    mark  = marks [pin] ;
    space = range [pin] - mark ;

    if (mark != 0)
      digitalWrite (pin, HIGH) ;
    delayMicroseconds (mark * 100) ;

    if (space != 0)
      digitalWrite (pin, LOW) ;
    delayMicroseconds (space * 100) ;
  }

  return NULL ;
}

在 Linux 中,线程与 pthread 对象相关,对吧?这个 void*X(void* dummy) 与线程有什么关系?

【问题讨论】:

    标签: c linux multithreading macros


    【解决方案1】:
    int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                   void *(*start_routine) (void *), void *arg);
    

    可以看到线程的start_routine有一个原型,取参数void *,返回一个void *

    在您的示例中,该函数不需要参数即可工作,也不需要返回任何有意义的内容。但它仍然必须有这样的原型才能用于创建新线程。所以宏:

    #define PI_THREAD(X) void *X (void *dummy)
    

    dummy是无用的参数,需要在函数中return NULL符合原型。

    【讨论】:

      【解决方案2】:

      pthreads API 创建运行用户指定函数的线程。 pthread_create 函数假定此函数具有签名

      void* function(void* arg);
      

      因此,宏定义接受void* 并返回void* 的函数是有意义的,因为这是将作为线程例程调用和运行的函数的签名。

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-09
        • 2012-08-12
        • 2016-06-11
        • 2015-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多