我有一个函数说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。
答案 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线程完成后的状态。我推测你在这里遇到了一些每个进程资源的限制。
正如其他人所说,这不是很好的设计 - 为什么不重新使用线程而不是在每个循环上创建一个新线程?