[重新开楼]续求大人救命......[程序有些长,请您耐心帮忙看看]
来源: 互联网 发布时间: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,在我用这个函数进行处理数据时,输出的东西不是我想要的。
我理想的结果是:每个线程调用这个函数对数据进行处理,然后相互不干扰的输出处理后的数据,但现在的输出是相互干扰的,就是说在这个线程处理这个数据,没输出全部处理后的结果前,另一个线程的处理结果也开始输出了!这可能是这个函数不是线程安全造成的,所以想起大家指点下有什么方法可以解决这个问题不?跪谢大家了!!!
这个函数的功能也很简单,首先是经过一系列处理建立起一个连接,封装了一个PDU,然后发往目的主机,然后对回复的PDU进行分析,将回复的内容输出到标准输出。
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次了吧