удаление в потоках дает ошибку сегментации

0

Эта программа учитывает появление слова в строке. Он работает, как ожидалось, но у меня есть две проблемы:

  1. delete tmp прокомментирован на данный момент (строка 57). Если он раскоментирован и скомпилирован, мой исполняемый файл дает "ошибку сегментации". Как ни странно, он не сбой при работе в gdb или с valgrind.
  2. Строки 65 и 66: в идеале эти потоки должны быть соединены. Но я получаю правильный вывод, даже если они не объединены. Это как он ведет себя для общей (изменчивой) переменной?
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <fstream>
#include <new>
#define MAX_BUFF 1000

using namespace std;
volatile int tcount=0;
pthread_mutex_t myMux;

typedef struct data
{
    string line;
    string arg;
}tdata;

void *calcWordCount(void *arg)
{
    tdata *tmp = (tdata *)arg;
    string line = tmp->line;
    string s = tmp->arg;
    int startpos = 0;
    int finds = 0;
    while ((startpos = line.find(s, startpos)) != std::string::npos)
    {
            ++finds;
            startpos+=1;
            pthread_mutex_lock(&myMux);
            tcount++;
            pthread_mutex_unlock(&myMux);
    }
    //cout<<endl<<line<<s<<" "<<finds<<endl;
}
int main(int argc,char *argv[])
{
  pthread_t thread_ids[10000];
  int cnt=1;
  int thread_cnt=0;
  void *exit_status;
  int targc=argc;
  ifstream infile("testfile");  
  string line;
  while(getline(infile,line))
  {
        while(targc >1)
        {
              tdata *tmp = new tdata;
          tmp->line = line;
              tmp->arg = argv[cnt];
              pthread_create(&thread_ids[thread_cnt],NULL,calcWordCount,tmp);
              thread_cnt++;
              cnt++;
              targc--;
              //delete tmp;
        }
    cnt=1;
    targc=argc;

}
infile.close();
int j;
/*for(j=0;j<thread_cnt;j++)
    pthread_join(thread_ids[j],&exit_status);*/
cout<<tcount<<endl;
return 0;
} 
  • 0
    Вы не можете удалить tmp потому что созданный вами поток все еще работает.
  • 2
    Вам нужно будет сохранять указатели данных tmp пока вы не присоединитесь ко всем своим потокам.
Показать ещё 7 комментариев
Теги:
mutex
pthreads

1 ответ

0

У вас есть неопределенное поведение, поскольку вы вызываете delete на tmp а другой поток потребляет его.

Одним из исправлений было бы создание и передача (по значению) std::shared_ptr а не голого указателя в ваш рабочий поток. Вы можете использовать методы release и reset в своем основном цикле. Память будет выпущена std::shared_ptr только рабочий поток будет выполнен с ней.

  • 0
    Спасибо за ваше предложение. Я никогда не использовал shared_ptr, позвольте мне сказать, как их использовать. Это работает, я буду обновлять здесь .. :)
  • 0
    Эй, я не могу найти соответствующий пример shared_ptr с потоками. Можете ли вы пролить свет на это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню