Почему я получаю сообщение об ошибке: «pthread_delay_np» не был объявлен в этой области »? - PullRequest
2 голосов
/ 29 ноября 2010

Я пытался выяснить, возможно ли избежать запуска потока сразу после 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 ]

3 голосов
/ 29 ноября 2010

Цитирование из некоторый список рассылки :

Также доступно в HP-UX, VMS и Tru64 UNIXpthread_delay_np() заимствовано из черновика D4 стандарта POSIX.1c.Основным исполнителем POSIX.1c D4 была OSF для распределенной вычислительной среды (DCE).Суффикс _np означает, что API является непереносимым и не может быть доступным на другой платформе.Обычно nanosleep() - это то, что вы хотите использовать в качестве замены.

2 голосов
/ 29 ноября 2010

Просто используйте nanosleep(2).

1 голос
/ 29 ноября 2010

Вы можете использовать семафор, чтобы указать потоку, что он может начать выполнение после точки ожидания семафора.

Ответ, вероятно, будет зависеть от того, чего вы пытаетесь достичь, избегая немедленного начала потока.

EDIT

Однако я вполне уверен, что фиксированная задержка не , что вам действительно нужно, если только вы не взаимодействуете со средой (например, аппаратными средствами) или просто экспериментируете.

1 голос
/ 29 ноября 2010

Похоже, что pthread_delay_np является нестандартной, непереносимой (отсюда и суффикс _np) функцией. Вы уверены, что он существует для вашей платформы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...