Проблема в приостановке потока posix для определенного интервала времени в c - PullRequest
0 голосов
/ 20 августа 2010

Мне нужно вызвать один метод в отдельном потоке (я использую поток posix), который обновляет некоторое значение после каждых 5 секунд, для которого записан код ниже.

void *threadEntry(void *)
{
  while(1)
  {
    updateValue();//to update some values
    usleep(5000000);//pause for 5 second
   }
}
pthread_t thread1;
pthread_create(&thread1,NULL,threadEntry,NULL);

Но этот поток получает ошибку сегментации через 4-5 минут. В чем может быть причина? Есть ли другой способ приостановить поток posix. (Я использую Linux)

Ответы [ 2 ]

1 голос
/ 20 августа 2010

В системах POSIX (что такое linux) nanosleep - правильная вещь для такого сна:

int nanosleep(const struct timespec *req, struct timespec *rem);

, где req - ваш запрос, а rem - оставшееся время для сна, если ваш поток был прерван преждевременно.

1 голос
/ 20 августа 2010

Правильнее всего использовать nanosleep, потому что сон и сон могут мешать SIGALARM, в то время как nanosleep был специально разработан с учётом потоков:

struct timespec mytimeout = {
    .tv_sec = 5,
    .tv_usec = 0,
};
struct timespec remaining;
nanosleep(&mytimeout, &remaining);

Мой оригинальный ответ - использовать трюк выбора, но давайте прекратим продвигать плохой код

Возвращаясь к корню проблемы, откуда вы знаете, что ваша ошибка сегментации возникла из спящего кода?Вы получили дамп ядра, который вы могли бы отследить?

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