【发布时间】:2013-05-16 07:14:10
【问题描述】:
我在多线程程序中遇到问题。我的程序有 4 个线程总是在这里。 我们将这些线程命名为 1 到 4。
我的程序的目标是在套接字上与外围设备进行通信。 线程号 4 用于向外围设备发送消息。
每次向外围设备发送消息时,我都会使用:
pthread_create(&m_hThreadMsgReader, NULL, &ThreadMsgReader, (void*) &argStruct);
这将创建一个线程来监听套接字上的响应,当套接字不再包含消息时,该线程将返回:即
ifiRet = recv(m_iSocket, pcRecBuf, DEFAULT_READ_DATA_LEN, 0); 使 iRet 取值为 0。
因此,在当前实现中,外围设备(除了通过用户输入发送的其他命令)(每分钟)进行一次数据池。
这里的问题是,几个小时后,pthread create 会崩溃并出现错误 11。我在堆栈溢出时看到这意味着系统可能没有足够的资源或线程太多。
但我不明白,因为在 QtCreator 调试中,我只能看到从 1 到 4 的线程。我知道我可能已经创建了 300 个线程,但线程列表只包含 4 个,这意味着所有其他线程都是终止。
所以我不太明白线程创建的最大数量是在进程的整个生命周期内还是同时存在的线程数。
我是否应该找到一种方法让单个线程进行监听,即使它会在空套接字上进行监听?我的实现是不是一个糟糕的模式?
【问题讨论】:
-
因“错误 11”而崩溃是分段错误。它可能与任何类型的资源稀缺无关,但您访问的是您不应该访问的指针。当然,这会发生在例如内存分配失败并且您没有检查返回的指针时。
-
在这里提出了类似的问题,stackoverflow.com/questions/622890/…
-
第一次Divyang没找到,我去试试,谢谢指点,知道好不好再回复你
-
你在加入那些话题吗?还是任由它们腐烂?
-
我认为只要让他们返回就可以进行清理,因为我刚刚阅读了这篇文章:domaigne.com/blog/computing/joinable-and-detached-threads 我知道使用 detachable 属性是我一直在寻找的,现在我有了等待我的程序达到相同的状态,看看它是否有效
标签: c++ pthreads qt-creator