C++ 在线程中删除会导致分段错误

C++ 在线程中删除会导致分段错误,c++,pthreads,mutex,C++,Pthreads,Mutex,该程序统计一行中某个单词的出现次数。它按预期运行,但我有两个顾虑: delete tmp从现在开始被注释(第57行)。如果未注释和编译,我的可执行文件将给出“分段错误”。奇怪的是,它在gdb或valgrind中运行时不会崩溃 第65行和第66行:理想情况下,这些螺纹需要连接。但是,我得到了正确的输出,即使它们没有合并。这就是共享(易失性)变量的行为方式吗 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #定义最大增益1000 使用名称空间std; volatile int tcount=

该程序统计一行中某个单词的出现次数。它按预期运行,但我有两个顾虑:

  • delete tmp
    从现在开始被注释(第57行)。如果未注释和编译,我的可执行文件将给出“分段错误”。奇怪的是,它在
    gdb
    valgrind
    中运行时不会崩溃
  • 第65行和第66行:理想情况下,这些螺纹需要连接。但是,我得到了正确的输出,即使它们没有合并。这就是共享(易失性)变量的行为方式吗
  • #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #定义最大增益1000
    使用名称空间std;
    volatile int tcount=0;
    pthread_mutex_t myMux;
    typedef结构数据
    {
    弦线;
    字符串arg;
    }tdata;
    void*calcWordCount(void*arg)
    {
    tdata*tmp=(tdata*)参数;
    字符串行=tmp->行;
    字符串s=tmp->arg;
    int startpos=0;
    int=0;
    while((startpos=line.find(s,startpos))!=std::string::npos)
    {
    ++发现;
    startpos+=1;
    pthread_mutex_lock(&myMux);
    t计数++;
    pthread_mutex_unlock(&myMux);
    }
    
    //当您在
    tmp
    上调用
    delete
    时,可能有未定义的行为,而另一个线程正在使用它


    一个解决方案是创建和传递(按值)一个
    std::shared_ptr
    而不是插入工作线程的裸指针。您可以在主循环中使用
    release
    reset
    方法。一旦工作线程完成,内存将由
    std::shared_ptr
    释放。

    您不能删除
    tmp
    ,因为您刚刚创建的线程仍然是空的l运行。您需要保留<代码> TMP < /代码>数据指针,直到您加入了所有线程。@ Ajit“我将如何保持跟踪”,例如,您可以使用“代码> STD::向量< /代码>。还请记住,<代码>易失性< /代码>不足以使<代码> tCube < /Cord>线程安全。请考虑使用<代码> STD::原子TCUT/<代码>。Ajit
    volatile
    在你的例子中是无用的。根据经验,它会以非常有趣的方式破坏你的代码。还有,它可以让你的生活更轻松。谢谢你的建议。我从来没有使用过shared_ptr,让我来研究一下如何使用它们。它起作用了,我会在这里更新…)嘿,我找不到合适的考试有线程的共享ptr的例子。你能帮我解释一下吗。