Эта программа учитывает появление слова в строке. Он работает, как ожидалось, но у меня есть две проблемы:
delete tmp
прокомментирован на данный момент (строка 57). Если он раскоментирован и скомпилирован, мой исполняемый файл дает "ошибку сегментации". Как ни странно, он не сбой при работе в gdb
или с valgrind
.#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;
}
У вас есть неопределенное поведение, поскольку вы вызываете delete
на tmp
а другой поток потребляет его.
Одним из исправлений было бы создание и передача (по значению) std::shared_ptr
а не голого указателя в ваш рабочий поток. Вы можете использовать методы release
и reset
в своем основном цикле. Память будет выпущена std::shared_ptr
только рабочий поток будет выполнен с ней.
tmp
потому что созданный вами поток все еще работает.tmp
пока вы не присоединитесь ко всем своим потокам.