0

这个 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) 与线程有什么关系?

4

2 回答 2

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在函数中遵守原型。

于 2013-10-08T03:03:07.723 回答
1

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

void* function(void* arg);

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

希望这可以帮助!

于 2013-10-08T03:03:37.210 回答