为什么我会收到“错误:'pthread_delay_np'未在此范围内声明”?

时间:2010-11-29 15:40:28

标签: c++ linux posix

我试图看看是否有可能避免线程在thread_create之后立即启动。所以,我遇到了pthread_delay_np,我尝试了这个例子:

#define _MULTI_THREADED
#include <stdio.h>
#include <time.h>
#include <pthread.h>
#define NTHREADS 5

void *threadfunc(void *parm)
{
  int               rc;
  struct timespec   ts = {0, 0};

  /* 5 and 1/2 seconds */
  ts.tv_sec  = 5;
  ts.tv_nsec = 500000000;

  printf("Thread blocked\n");
  rc = pthread_delay_np(&ts);
  if (rc != 0) {
    printf("pthread_delay_np() - return code %d\n", rc);
    return (void*)&rc;
  }
  printf("Wait timed out!\n");

  return NULL;
}

int main(int argc, char **argv)
{
  int                   rc=0;
  int                   i;
  pthread_t             threadid[NTHREADS];
  void                 *status;
  int                   fail=0;

  printf("Enter Testcase - %s\n", argv[0]);

  printf("Create %d threads\n", NTHREADS);
  for(i=0; i<NTHREADS; ++i) {
    rc = pthread_create(&threadid[i], NULL, threadfunc, NULL);
  }

  printf("Wait for threads and cleanup\n");
  for (i=0; i<NTHREADS; ++i) {
    rc = pthread_join(threadid[i], &status);
    if (status != NULL) {
      fail = 1;
    }
  }

  if (fail) {
    printf("At least one thread failed!\n");
    return 1;
  }
  printf("Main completed\n");
  return 0;
}

但我一直得到“错误:'pthread_delay_np'未在此范围内声明”。有人知道为什么吗?

另外,还有其他方法可以阻止线程在thread_create之后立即启动吗?与调度程序有什么关系?

提前谢谢!!

4 个答案:

答案 0 :(得分:3)

引自some mailing list

  

它也适用于HP-UX,VMS和Tru64 UNIX。 pthread_delay_np()起源于POSIX.1c标准的D4草案。 POSIX.1c D4的主要实现者是分布式计算环境(DCE)的OSF。后缀_np表示API是不可移植的,不能依赖于另一个平台上的API。通常nanosleep()是您想要用作替代品的。

答案 1 :(得分:2)

只需使用nanosleep(2)

答案 2 :(得分:1)

pthread_delay_np似乎是非标准的,非便携式(因此为“_np”后缀)功能。您确定它适用于您的平台吗?

答案 3 :(得分:1)

您可以使用信号量向线程指示它可以通过信号量等待点开始执行。

答案可能取决于你试图通过避免线程立即启动来实现的目标。

修改

但是,我非常确定固定延迟您实际需要的内容,除非您正在与环境(例如硬件)进行交互或仅进行实验。