为啥我会收到“错误:‘pthread_delay_np’未在此范围内声明”?

Posted

技术标签:

【中文标题】为啥我会收到“错误:‘pthread_delay_np’未在此范围内声明”?【英文标题】:Why do I get "error: ‘pthread_delay_np’ was not declared in this scope"?为什么我会收到“错误:‘pthread_delay_np’未在此范围内声明”? 【发布时间】:2010-11-29 15:40:28 【问题描述】:

我试图查看是否有可能避免线程在 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 之后立即启动吗?跟调度器有什么关系?

提前谢谢你!!

【问题讨论】:

【参考方案1】:

引用some mailing list:

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

【讨论】:

【参考方案2】:

只需改用nanosleep(2)

【讨论】:

【参考方案3】:

看来pthread_delay_np 是一个非标准、不可移植(因此有“_np”后缀)的函数。您确定它存在于您的平台吗?

【讨论】:

嗯...显然它在我的平台上不存在。 :( 那么,我该怎么做才能防止线程在 thread_create 之后立即启动? @delay:正如其他答案所说,您应该可以使用nanosleep【参考方案4】:

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

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

编辑

但是,我很确定固定延迟不是您真正需要的,除非您正在与环境(例如硬件)交互或只是在试验。

【讨论】:

以上是关于为啥我会收到“错误:‘pthread_delay_np’未在此范围内声明”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会收到此错误

为啥我会收到这个 TypeError?

为啥我会收到序列化错误?

为啥我会收到错误消息?

知道为啥我会收到此错误吗?

为啥我会收到这种错误验证错误?