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

发布于 2022-08-29 20:46:29 字数 616 浏览 26 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

再可℃爱ぅ一点好了 2022-09-05 20:46:29

url 是指向一个全局共享内存,你的线程还没有处理,push 到队列里面的指针就已经被下一次 strtok 调用给破坏掉,如果再访问这些指针就会段错误。

改用 strtok_r 就好了。

起风了 2022-09-05 20:46:29

我的理解是: char buf[800] 分配在主线程的栈空间上, 而每次 strtok 后, url 指向 buf 的地址. 所以对 子线程来说, 这里存在 Cross-thread Stack Access.

https://software.intel.com/sites/products/documentation/hpc/inspectorxe/en-us/2011Update/lin/ug_docs/GUID-F0B0D34B-6691-4033-931F-4BBBD1A1F791.htm

strtok_r 无济于事. 试着 每次在把 url 的内容 在堆里拷贝一份, 传给 子线程, 然后 delete 掉.
当然更好的办法是在 线程 数据结构里 给 url 分配相应的内存.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文