开发者社区> 问答> 正文

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

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拷贝源串的都是主线程自己】

展开
收起
a123456678 2016-06-06 19:34:50 2221 0
1 条回答
写回答
取消 提交回答
  • url 是指向一个全局共享内存,你的线程还没有处理,push 到队列里面的指针就已经被下一次 strtok 调用给破坏掉,如果再访问这些指针就会段错误。

    2019-07-17 19:29:18
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载