[英]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语句运行这种代码时,它可以运行几个小时,然后抛出“无法创建线程”和应用程序终止的消息。 有没有人知道我在哪里犯错误。 此外,如果有一种方法来运行ThreadTest
在main
使用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.