我在第一次尝试使用C中的线程时遇到了一些麻烦.我正在尝试(现在)编写一个非常简单的服务器程序,该程序接受套接字连接并启动一个新线程来处理它.它似乎工作正常,除了在pthread_create()失败并且使用EAGAIN代码之前它只会创建大约300个线程(303,有时是304),这意味着:
"系统缺少创建另一个线程所需的资源,或者会超出系统对进程中线程总数的限制{PTHREAD_THREADS_MAX}."
这不是 303个线程同时 - 每个线程退出,由gdb确认.每次调用进程请求函数时,都会运行两个线程.
所以它意味着"系统缺乏必要的资源".我的问题是(而且可能有点愚蠢) - 这些资源是什么?据推测,这是我的程序中的内存泄漏(当然可能,甚至可能),但我认为即使如此,考虑到程序的其余部分做得很少,它可以管理超过300个.
我怎样才能知道我的程序可用多少内存来确认它已经用完了?有足够的内存和交换免费,所以可能是操作系统(Linux)强加的人为限制.
谢谢
我正在尝试使用GTK构建一个hello world,其中包括以下行:
#include <gtk/gtk.h>
Run Code Online (Sandbox Code Playgroud)
正如你所料.
提供的Makefile有以下行:
GTK_INCLUDE = -I/usr/local/include
Run Code Online (Sandbox Code Playgroud)
所以它希望在/usr/local/include/gtk/gtk.h中找到gtk.h.但是在我的系统上,它位于/usr/local/include/gtk-2.0/gtk/gtk.h中,即位于版本的子目录中.
显然,在这种情况下,我可以将-I/usr/local/include/gtk-2.0添加到Makefile中,但同样的问题也会出现与gtk.h的依赖关系等等.
有没有一个很好的方法来解决这个问题?可以配置用于查找头文件的位置并添加适当的包含目录吗?我对配置几乎一无所知,但它似乎在构建时找到了关于系统的事情,这就是我所追求的.
这是一个常见的事件,还是我有一些怪异的目录结构,这是真正的问题?
感谢您的任何指示!
我一直在使用带有基于Make的代码库的sbox而没有任何问题.现在我正在使用基于scons的代码库,并且遇到了一些奇怪的问题.
似乎在scratchbox中,scons找不到g ++.例如,它尝试执行以下操作:
你好hello.c
什么时候该做:
g ++ -o hello hello.c
所以可能它的g ++字符串变量是空的.g ++存在于PATH中 - "g ++"产生/ scratchbox/compilers/bin/g ++.
相同的源在scratchbox之外构建得很好,所以它不应该是scons或代码库的问题.工作时,没有在scratchbox之外设置的特殊环境变量.
如果我象征性地将/ usr/bin/g ++链接到/ scratchbox/compilers/bin/g ++,它会更进一步(产生正确的g ++命令)但是在执行它们时会产生:
sb_gcc_wrapper(g ++):/ scratchbox/compilers/arm-linux-cs2007q3-51sb3/bin/sbox-arm-none-linux-gnueabi-g ++:没有这样的文件或目录
列出的文件是存在.
PATH包含/ scratchbox/compilers/bin,SBOX_REDIRECT_FROM_DIRS包含/ usr/bin,SBOX_REDIRECT_TO_DIRS包含/ scratchbox/compilers/bin,所以我认为它应该能够找到它.
任何建议,将不胜感激!谢谢,雷
编辑:也许相关 - 除非我在scons文件中添加完整路径,否则它也找不到pkg-config
首先,我对C++很陌生.我认为这getline()
不是标准的C函数,因此#define _GNU_SOURCE
需要使用它.我现在正在使用C++,g ++告诉我_GNU_SOURCE
已经定义了:
$ g++ -Wall -Werror parser.cpp
parser.cpp:1:1: error: "_GNU_SOURCE" redefined
<command-line>: error: this is the location of the previous definition
Run Code Online (Sandbox Code Playgroud)
任何人都可以确认这是标准的,还是隐藏在我的设置中的某个地方?我不确定所引用的最后一行的含义.
文件的包含如下,所以可能是它们中的一个或多个定义了?
#include <iostream>
#include <string>
#include <cctype>
#include <cstdlib>
#include <list>
#include <sstream>
Run Code Online (Sandbox Code Playgroud)
谢谢!
我编写了一个HTTP代理,它做了一些与此无关的东西,但它增加了客户的服务时间(600us没有代理,60000us).我想我已经找到了大部分时间来自哪里 - 在我的代理完成发送回客户端和客户完成接收之间.目前,服务器,代理和客户端在同一主机上运行,使用localhost作为地址.
一旦代理完成发送(至少从send()返回后),我打印gettimeofday的结果,给出一个绝对时间.当我的客户收到时,它会输出gettimeofday的结果.由于它们都在同一主机上,因此这应该是准确的.所有send()调用都没有标志,因此它们是阻塞的.两者之间的差异大约是40000us.
它侦听客户端连接的代理套接字使用提示AF_UNSPEC,SOCK_STREAM和AI_PASSIVE进行设置.推测来自accept()的套接字将具有相同的参数?
如果我正确地理解了这一切,那么Apache设法在600us内完成所有工作(包括导致40000us延迟的相应内容).任何人都可以提出可能导致此问题的原因吗?我已经尝试设置TCP_NODELAY选项(我知道我不应该,只是为了看它是否有所不同)并且完成发送和完成接收之间的延迟时间下降,我忘记了数字但是<1000us.
这一切都在Ubuntu Linux 2.6.31-19上.谢谢你的帮助