运行 3 个线程时出现分段错误

Posted

技术标签:

【中文标题】运行 3 个线程时出现分段错误【英文标题】:Segmentation Fault when running 3 threads 【发布时间】:2016-11-07 22:31:13 【问题描述】:

所以我正在创建 3 个线程。 1 读取用户的输入 1 执行一些字符串操作, 1 写入命令提示符。

我已经设置了一些cout 语句来查看我在哪里遇到了错误。我可以看到我在创建线程后的某个时候收到了错误。

我认为它必须是首先执行哪个线程的东西。我希望readerThread 函数首先运行,然后是converterThread,最后是writerThread。我一直在寻找一些方法来在这些上实现更多逻辑,以限制线程运行的顺序并且找不到任何线程。

无论如何,这是我的代码:

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
int counter = 0;
vector<string> readBuffer;
vector<string> writeBuffer;
int main ()
    int readerInt,writerInt,converterInt;
    pthread_t reader,writer,converter;
    cout << "BEFORE"<<endl;
    readerInt = pthread_create(&reader, NULL,readerThread,NULL);
    converterInt = pthread_create(&converter,NULL,converterThread,NULL);
    writerInt = pthread_create(&writer,NULL,writerThread,NULL);
    cout << "AFTER" << endl;

    pthread_join(reader,NULL);
    pthread_join(converter,NULL);
    pthread_join(writer,NULL);

    return 0;

void * readerThread(void *unused)
    while(1)
    pthread_mutex_lock(&lock);
    string readLine;
    getline(cin,readLine);
    counter++;
    readBuffer.push_back(readLine);
    pthread_mutex_unlock(&lock);
    

void * converterThread(void *unused)
    while(1)
    pthread_mutex_lock(&lock);
    if(readBuffer.size() > 0)
        replace(readBuffer[counter-1].begin(),readBuffer[counter-1].end(),' ','%');
        writeBuffer.push_back(readBuffer[counter-1]);
    
    pthread_mutex_unlock(&lock);
    

void * writerThread(void *unused)
    while(1)
    pthread_mutex_lock(&lock);
    cout << writeBuffer[counter-1] << endl;
    pthread_mutex_unlock(&lock);
    

【问题讨论】:

听起来像是readers-writers 的问题。咨询您最近的浏览器并启动谷歌,答案应该正在等待 【参考方案1】:

您的writerThread 线程在数据到达和您访问之前启动作业:

cout << writeBuffer[counter-1] << endl;

counter 仍然是0。您应该在访问之前检查writeBuffer 的大小。

counter 变量并不总是对writeBuffer 有效。当数据在readBuffer 中,但尚未被converterThread 处理时,就会发生这种情况。

您可以删除 counter 变量的使用并改进 readBufferwriteBuffer 的数据结构。使用std::queue 创建数据转换队列。一个队列readBuffer 用于读取数据,一个writeBuffer 队列用于处理结果。使用推送/弹出方法。

【讨论】:

好吧,现在我得到了错误,它似乎一直在循环我的 readerThread 函数。好像解锁不了如果是,那么它会在其他功能运行之前重新锁定。 @droly96 如果分段错误得到修复,您可以在互斥锁之前使用sleep(1) 并调试您的线程以查看问题所在。

以上是关于运行 3 个线程时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

运行 zend_hash_find() 时出现分段错误

使用 pthread_create 时出现“分段错误(核心转储)”

运行我的代码时出现分段错误(核心转储)问题

分配时出现分段错误[重复]

在 Nao 上运行暗网分类器时出现分段错误

仅在不使用调试器时出现段错误