как запустить поток в основной функции бесконечно, не вызывая завершения программы - PullRequest
1 голос
/ 04 января 2011

У меня есть функция, скажем void *WorkerThread ( void *ptr).

Функция *WorkerThread( void *ptr) имеет бесконечный цикл, который непрерывно читает и пишет с последовательного порта

пример

void *WorkerThread( void *ptr)
{  
while(1)  
     {  
     // READS AND WRITE  from Serial Port USING MUXTEX_LOCK AND MUTEX_UNLOCK 


    } //while ends  

}     

Другая функция, которую я пишу, это ThreadTest пример

int ThreadTest()  
{  
    pthread_t Worker;  
    int iret1;  
    pthread_mutex_init(&stop_mutex, NULL);  
    if( iret1 = pthread_create(&Worker, NULL, WorkerThread, NULL) == 0)  
    {  
     pthread_mutex_lock(&stop_mutex);  
     stopThread = true;  
     pthread_mutex_unlock(&stop_mutex);  
    }  

 if (stopThread != false)  
     stopThread = false;  
pthread_mutex_destroy(&stop_mutex);  

return 0;    
}    

В main функция
У меня есть что-то вроде

int main(int argc, char **argv)  
{  

    fd = OpenSerialPort();  
    if( ConfigurePort(fd) < 0) return 0;  

    while (true)   
    {

        ThreadTest();  
    }
return 0;  
}  

Теперь, когда я запускаю такой код соператор отладки работает нормально в течение нескольких часов, а затем выдает сообщение типа «не удается создать поток», и приложение завершает работу.У кого-нибудь есть идеи, где я делаю ошибки.Также, если есть способ запустить ThreadTest в main с использованием while(true), как я уже использую while(1) в ThreadWorker для чтения и записи бесконечно.Все комментарии и критика приветствуются.Спасибо и всего наилучшего, SamPrat.

Ответы [ 5 ]

1 голос
/ 04 января 2011

Ваши pthreads зомби и потребляют системные ресурсы. Для Linux вы можете использовать ulimit -s для проверки ваших активных верхних пределов, но они также не бесконечны. Используйте pthread_join () , чтобы завершить поток и освободить ресурсы, которые он использовал.

Знаете ли вы, что select () может читать с нескольких дескрипторов (устройства)? Вы также можете определить пользовательский source , чтобы остановить select () или тайм-аут. Имея это в виду, вы можете запустить один поток и позволить ему sleep , если ничего не происходит. Если вы намереваетесь остановить его, вы можете отправить событие (или тайм-аут), чтобы прервать вызов функции select ().

Дополнительной концепцией проектирования, которую вы должны рассмотреть, является очереди сообщений для обмена информацией между вашим основным приложением и / или pthread. Функция select () совместима с этим методом, поэтому вы можете использовать одну концепцию для источников данных (устройств и очередей сообщений).

Здесь ссылка на хорошее чтение pthread и лучшую доступную книгу pthread: Программирование с помощью потоков POSIX (R) , ISBN-13: 978- 0201633924

1 голос
/ 04 января 2011

Потоки потребляют ресурсы (память и обработка), и вы создаете поток каждый раз, когда ваш основной цикл вызывает ThreadTest(). И ресурсы конечны, а ваш цикл - нет, поэтому это в конечном итоге приведет к ошибке выделения памяти.

Вы должны избавиться от основного цикла и заставить ThreadTest вернуть только что созданный поток (pthread_t). Наконец, заставьте main дождаться завершения потока, используя pthread_join .

1 голос
/ 04 января 2011

Вы создаете потоки постоянно и, возможно, превышаете ограничение на количество потоков.Страница руководства Pthread_create гласит:

EAGAIN Insufficient resources to create another thread, or a system-imposed
              limit on the number of threads was encountered.  The latter case may
              occur in two ways: the RLIMIT_NPROC soft resource limit (set via
              setrlimit(2)), which limits the number of process for a real user ID,
              was reached; or the kernel's system-wide limit on the number of
              threads, /proc/sys/kernel/threads-max, was reached.

Вам следует переосмыслить дизайн своего приложения.Создание бесконечного числа потоков - это не лучший дизайн.

[ОБНОВЛЕНИЕ]

вы используете блокировку для установки целочисленной переменной:

pthread_mutex_lock(&stop_mutex);  
     stopThread = true;  
     pthread_mutex_unlock(&stop_mutex);

Однаконе требуется, поскольку установка int является атомарной (вероятно, на всех архитектурах?).Вам следует использовать блокировку, когда вы выполняете неатомарные операции, например: test and set

take_lock ();
if (a != 1)
a = 1
release_lock ();  
1 голос
/ 04 января 2011

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

0 голосов
/ 04 января 2011

Похоже, вы не звонили pthread_join(), который очищает состояние после завершения неотсоединенных потоков.Я бы предположил, что в результате вы достигли некоторого лимита на ресурсы процесса.

Как уже отмечали другие, это не очень хороший дизайн - почему бы не использовать поток, а не создавать новый вкаждый цикл?

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