Добрый день, нужна помощь в устранении следующей проблемы.
ОС Linux Fedora 2.6
Программа читает файловый дескриптор /dev/serial/chan0, обрабатывает полученные данные
и пишет "ответы" в этот дескриптор. Все это выполняется в бесконечном цикле while (см код).
Программа работает нормально примерно несколько (по разному) тысяч циклов while, после чего ни с того ни с сего
в этом цикле появляются ощутимые задержки длительностью несколько сот микросекунд. Есть подозрение, что
"забивается" стек CPU или еще какие-то системные ресурсы. Программа может работать бесконечно, но из-за
задержек теряется часть данных принимаемых из файлового дескриптора.
CPU LOAD < 1%, память вроде бы не растет, valgrind утечек не находит. На работе других программ задержки
не сказываются. Абсолютно точно известно, что данные извне в файловый дескриптор поступают без задержек.
Программа использует pthreads но ВСЕ они создаются PTHREAD_CREATE_DETACHED.
Причина видимо в THREAD_FUNC, но как дочерняя нить может КАК-ЛИБО влиять на родительский поток ?
Буду благодарен за подсказку где искать проблему.
struct MESSAGE
{
ssize_t LEN; // NUMBER OF BYTES IN DATA
u_char DATA[1000];
~MESSAGE(); // DESTRUCTOR
};
void main()
{
ssize_t nrx=0; u_char buffer[50]={0};
int chan = open("/dev/serial/chan0", O_RDWR);
MESSAGE MSG_BUF;
if (chan > 0)
{
while (true)
{
nrx = read (chan, buffer, 50);
memcpy (MSG_BUF.DATA, buffer, nrx); MSG_BUF.LEN=nrx;
START_PROC(&MSG_BUF); ... ЭТА ПРОЦЕДУРА СОЗДАЕТ ЗАДЕРЖКИ ???!!! ...
}
}
}
void START_PROC(void *arg)
{
pthread_attr_t attr_PRC; pthread_t tid_PRC; sched_param param_PRC;
pthread_attr_init(&attr_PRC); param_PRC.__sched_priority=99;
pthread_attr_setschedparam (&attr_PRC, ¶m_PRC);
pthread_attr_setschedpolicy (&attr_PRC, SCHED_RR);
pthread_attr_setdetachstate (&attr_PRC, PTHREAD_CREATE_DETACHED);
pthread_create (&tid_PRC, &attr_PRC, THREAD_FUNC, arg);
}
void *THREAD_FUNC(void *arg)
{
... PROCESS DATA AND WRITE RESPONSE ...
}
Добавлено форматирование — Кодт
27.09.06 16:40: Перенесено из 'C/C++'