为了账号安全,请及时绑定邮箱和手机立即绑定

多线程下对一个串多次调用strok后strlen报段错误

多线程下对一个串多次调用strok后strlen报段错误

绝地无双 2019-04-13 08:46:18
while(1){charbuf[800]={0};ret=fgets(buf,sizeof(buf)-1,fp);if(!ret){...lseektoheadoffilecontinue;}//问题很可能出在这里,改成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拷贝源串的都是主线程自己】
查看完整描述

2 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

url是指向一个全局共享内存,你的线程还没有处理,push到队列里面的指针就已经被下一次strtok调用给破坏掉,如果再访问这些指针就会段错误。
改用strtok_r就好了。
                            
查看完整回答
反对 回复 2019-04-13
  • 2 回答
  • 0 关注
  • 234 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号