如何在主函数中无限运行线程而不会导致程序终止

时间:2011-01-04 11:05:59

标签: c pthreads

我有一个函数说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;  
}  

现在,当我使用debug语句运行这种代码时,它可以运行几个小时,然后抛出“无法创建线程”和应用程序终止的消息。 有没有人知道我在哪里犯错误。 此外,如果使用ThreadTest可以在main中运行while(true),因为我已经在while(1)中使用ThreadWorker进行无限读写。 欢迎所有评论和批评。 谢谢&amp;问候, SamPrat。

5 个答案:

答案 0 :(得分:1)

您正在不断创建线程,并且可能会达到线程数限制。 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.

您应该重新考虑应用程序的设计。创建无限数量的线程不是神设计。

[UPDATE]

您正在使用lock来设置整数变量:

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 :(得分:1)

每次调用ThreadTest时都会创建一个新线程,并且永远不会销毁这些线程。所以最终你(或操作系统)用尽了线程句柄(有限的资源)。

答案 2 :(得分:1)

线程消耗资源(内存和处理),并且每次主循环调用ThreadTest()时都会创建一个线程。资源是有限的,而你的循环不是,所以这最终会引发内存分配错误。

你应该摆脱主循环,让ThreadTest返回新创建的线程(pthread_t)。最后,使用pthread_join使main等待线程终止。

答案 3 :(得分:1)

您的pthread是zombies并消耗系统资源。对于Linux,您可以使用ulimit -s来检查您的活动上限 - 但它们也不是无限的。使用pthread_join()让线程完成并释放它消耗的资源。

您知道select()能够从多个(设备)句柄中读取吗?您还可以定义用户定义的以停止select()或超时。考虑到这一点,你可以启动一个线程并让它睡眠如果没有发生。如果你打算停止它,你可以发送事件(或超时)来打破select()函数调用。

您必须考虑的另一个设计概念是message queues,以便在主应用程序和/或pthread之间共享信息。 select()与此技术兼容,因此您可以将一个概念用于数据源(设备和消息队列)。

此处提供了良好的pthread阅读和最佳pthread书籍: Programming with POSIX(R) Threads ,ISBN-13:978-0201633924

答案 4 :(得分:0)

看起来你没有调用pthread_join()来清除non-detached线程完成后的状态。我推测你在这里遇到了一些每个进程资源的限制。

正如其他人所说,这不是很好的设计 - 为什么不重新使用线程而不是在每个循环上创建一个新线程?