繁体   English   中英

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

[英]how to run thread in main function infinitely without causing program to terminate

我有一个函数说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语句运行这种代码时,它可以运行几个小时,然后抛出“无法创建线程”和应用程序终止的消息。 有没有人知道我在哪里犯错误。 此外,如果有一种方法来运行ThreadTestmain使用while(true) ,因为我已经在使用while(1)ThreadWorker读取和写入无限。 欢迎所有评论和批评。 谢谢和问候,SamPrat。

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

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

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

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

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

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

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

这里提供了一个很好的pthread阅读和最好的pthread书: 使用POSIX(R)线程编程 ,ISBN-13:978-0201633924

看起来你没有调用pthread_join() ,它在非分离线程完成后清理状态。 我推测你在这里遇到了一些每个进程资源限制。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM