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

时间:2016-11-07 22:31:13

标签: c++ linux multithreading segmentation-fault

所以我创建了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);
    }
}

1 个答案:

答案 0 :(得分:1)

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

cout << writeBuffer[counter-1] << endl;
counter仍为0

。您应该在访问之前检查writeBuffer的大小。

counter变量对writeBuffer并不总是有效。如果数据位于readBuffer,但尚未由converterThread处理,则会发生这种情况。

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