while(1)
{
char buf[800] ={0};
ret=fgets(buf, sizeof(buf) -1, fp);
if(!ret){
...lseek to head of file
continue;
}
//问题很可能出在这里,改成strtok_r还是会同样出错
char *url=strtok(buf,"\n");
index++;
thread=&stk_threads[index];
stk_thread_push_task(thread, url);
if(++index==max_thread)
{
index=0;
}
}
先贴代码如上,问题如下
程序在对一个文件遍历一段时间(我确定还没遇到过尾部)之后,在push到选定thread的队列时【主程序会用strlen判断url处(来源指针)的字串长度,从而拷贝一份出来,防止各线程读到重复的url内容】在strlen时候报段错误。
我知道strtok的实现原理,但是不明白这个段错误在这个情形下发生的具体原因是什么呢?【注意,执行strtok和push到选定线程以及调用strlen拷贝源串的都是主线程自己】
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
url 是指向一个全局共享内存,你的线程还没有处理,push 到队列里面的指针就已经被下一次 strtok 调用给破坏掉,如果再访问这些指针就会段错误。