当前位置:  技术问答>编程技术其它 iis7站长之家

[重新开楼]续求大人救命......[程序有些长,请您耐心帮忙看看]

    来源: 互联网  发布时间:2016-06-09

    本文导语:  原帖地址为: http://topic.csdn.net/u/20090526/11/6a92738a-55c3-4023-a2f1-1bb6692fe553.html?345186959 原来的问题已经解决了,可以见原帖最后一楼! 原帖的问题是由于在这个函数中多加了一个sleep语句引起的,删除它就可以了。 myproce...

原帖地址为:
http://topic.csdn.net/u/20090526/11/6a92738a-55c3-4023-a2f1-1bb6692fe553.html?345186959
原来的问题已经解决了,可以见原帖最后一楼!

原帖的问题是由于在这个函数中多加了一个sleep语句引起的,删除它就可以了。

myprocess函数只是简单的把从文件中读取的数据输出到标准输出上,这只是我想完成的一个测试,就是测试能否由多线程快速的读取出这些数据
现在这一步已经实现了,我的本意是调用下面的parse_oid()函数对每个线程读取的数据进行处理,这个函数实际是一个SNMP中的getnext操作,其中用到了大量的SNMP的API,在我用这个函数进行处理数据时,输出的东西不是我想要的。
我理想的结果是:每个线程调用这个函数对数据进行处理,然后相互不干扰的输出处理后的数据,但现在的输出是相互干扰的,就是说在这个线程处理这个数据,没输出全部处理后的结果前,另一个线程的处理结果也开始输出了!这可能是这个函数不是线程安全造成的,所以想起大家指点下有什么方法可以解决这个问题不?跪谢大家了!!!

void *
    myprocess (void *arg)
    {
        printf("%d:threadid is 0x%x,working on %sn",i,pthread_self(),(char *)arg);
        return NULL;
    }


这个函数的功能也很简单,首先是经过一系列处理建立起一个连接,封装了一个PDU,然后发往目的主机,然后对回复的PDU进行分析,将回复的内容输出到标准输出。

void *
myprocess(void *objoid)
{
netsnmp_session  session, *ss;
netsnmp_pdu  *pdu,*response;
netsnmp_variable_list  *vars;
oid  name[MAX_OID_LEN];
size_t name_length;
oid root[MAX_OID_LEN];
size_t rootlen;
int running;
int status;
int count;
int exitval = 0;
int numprinted = 0;

init_snmp("threadpool");

snmp_sess_init( &session );
session.peername = strdup("192.168.10.194");


session.version = SNMP_VERSION_2c;

session.securityName = strdup("motorola");
session.securityNameLen = strlen(session.securityName);

session.community = "public";
session.community_len = strlen(session.community);

session.securityLevel = SNMP_SEC_LEVEL_AUTHNOPRIV;

session.securityAuthProto = usmHMACMD5AuthProtocol;
session.securityAuthProtoLen = sizeof(usmHMACMD5AuthProtocol)/sizeof(oid);

session.securityAuthKeyLen = USM_AUTH_KU_LEN;


rootlen = MAX_OID_LEN;
if (snmp_parse_oid ((char *)objoid, root, &rootlen) == NULL) {
snmp_perror((char *)objoid);
exit(1);
}

SOCK_STARTUP;
ss = snmp_open(&session);
if(ss == NULL){
snmp_sess_perror("threadpool",&session);
SOCK_CLEANUP;
exit(1);
}

memmove(name,root,rootlen * sizeof(oid));
name_length = rootlen;

running = 1;
while (running) {
pdu = snmp_pdu_create(SNMP_MSG_GETNEXT);
snmp_add_null_var(pdu, name, name_length);

        status = snmp_synch_response(ss, pdu, &response);
    if (status == STAT_SUCCESS) {
    if (response->errstat == SNMP_ERR_NOERROR) {
    for (vars = response->variables; vars;                    
     vars = vars->next_variable) {
if ((vars->name_length name, rootlen * sizeof(oid))
!= 0)) { 
running = 0;//not part of this subtree
continue;
}

numprinted++;
print_variable(vars->name, vars->name_length, vars);
if ((vars->type != SNMP_ENDOFMIBVIEW) &&
(vars->type != SNMP_NOSUCHOBJECT) &&
(vars->type != SNMP_NOSUCHINSTANCE)) {
                        
memmove((char *) name, (char *) vars->name,
    vars->name_length * sizeof(oid));
    name_length = vars->name_length;
} else
      running = 0;
    }
    } else {
    running = 0;
if (response->errstat == SNMP_ERR_NOSUCHNAME) {
    printf("End of MIBn");
} else {
    fprintf(stderr, "Error in packet.nReason: %sn",
        snmp_errstring(response->errstat));
if (response->errindex != 0) {
fprintf(stderr, "Failed object: ");
 for (count = 1, vars = response->variables;
     vars && count != response->errindex;
 vars = vars->next_variable, count++)
    if (vars)
    fprint_objid(stderr, vars->name,
             vars->name_length);
    fprintf(stderr, "n");
    }
exitval = 2;
    }
}
    } else if (status == STAT_TIMEOUT) {
    fprintf(stderr, "Timeout: No Response from %sn",
        session.peername);
    running = 0;
exitval = 1;
} else {                
    snmp_sess_perror("threadpool", ss);
running = 0;
exitval = 1;
    }
    if (response)
    snmp_free_pdu(response);
    }
    snmp_close(ss);
    SOCK_CLEANUP;
}


|
void *myprocess(void *objoid)
{
    init_snmp("threadpool");

    snmp_sess_init( &session );
    snmp_parse_oid ((char *)objoid, root, &rootlen)

    SOCK_STARTUP;
    ss = snmp_open(&session);

    running = 1;
    while (running) {
        snmp_pdu_create(SNMP_MSG_GETNEXT);
        snmp_add_null_var(pdu, name, name_length);

        snmp_synch_response(ss, pdu, &response);
        snmp_free_pdu(response);
    }
    snmp_close(ss);
    SOCK_CLEANUP;
}


貌似除了打印到输出及错误设备外的哪些函数外,上面的那些函数也可能不是线程安全的

|
但现在的输出是相互干扰的
---------------
没看程序只歪歪一句:可能不可异步的线程你用了异步

|
还真是执着 开了不下3次了吧

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 那位大人有 cursor/ncursor 库编程的资料,100分送上!!
  • LINUX大人进来就我!!!!!
  • 版主大人,各位大俠,請幫幫忙(關於GL4Java 的安裝方法)
  • 紧急求助!各位大人,nvidia5200显卡挂不上,xwindows启不来,安装kernel-source后提示少了nvidia.o库
  • 各位大人,怎样显示前一两天的日期!
  • 哪位大人能否帮小弟看看?
  • 求助 请教各位大人 SHELL编程
  • 下午要东软面试,请各位大人给点意见(来着有分,up者不给)
  • linux新手,请教各位大人串口通讯问题(发送十六进制正常,接受数据错误)附源码
  • 提问的智慧(转,也许看看是有用的)请斑竹大人不要删


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3