Multithreading 我在多线程方面遇到了一些问题

Multithreading 我在多线程方面遇到了一些问题,multithreading,Multithreading,我正在与这个代码斗争。这是关于从文本文件中计算一些模式。我试图使用线程(分治)处理,但它返回了一个错误的值。我使用互斥值来同步关键部分。。代码如下。第一个主要参数是线程数,第二个是我想从中计算模式的文本文件名,下面是我想查找文本的模式。 请救救我 代码如下 char*缓冲区; int fsize,count; 字符**搜索词; int*字数; int*strlength; 类型定义结构参数{ int num1; int num2; }参数; pthread_mutex_t mutex; voi

我正在与这个代码斗争。这是关于从文本文件中计算一些模式。我试图使用线程(分治)处理,但它返回了一个错误的值。我使用互斥值来同步关键部分。。代码如下。第一个主要参数是线程数,第二个是我想从中计算模式的文本文件名,下面是我想查找文本的模式。 请救救我

代码如下


char*缓冲区;
int fsize,count;
字符**搜索词;
int*字数;
int*strlength;
类型定义结构参数{
int num1;
int num2;
}参数;
pthread_mutex_t mutex;
void*childfunc(void*arg)
{
int size,i,j,k,t,start,end,len,flag=-1;
int结果;
参数*a=(参数*)arg;
开始=a->num1;
结束=a->num2;
而(1){
如果(开始==0 | |开始==fsize)
打破
if(buffer[start]!=''&&buffer[start]!='\n'&&buffer[start]!='\t')
启动++;
其他的
打破
}
而(1){
if(end==fsize)
打破
if(buffer[end]!=''&&buffer[end]!='\n'&&buffer[end]!='\t')
end++;
其他的
打破
}
对于(i=0;i
参数a;//新a对于每个循环,以前的a不再存在
a、 num1=搜索开始;
a、 num2=搜索结束;
pthread_mutex_init(&mutex,NULL);
结果=pthread_create(&tid[i],NULL,childfunc,(void*)&a);
如果(结果<0){
perror(“pthread_create()”);
}
}//此处a超出范围
您将
a
的地址传递给每个线程,但是
a
在创建线程后立即超出范围。因此线程现在拥有堆栈上一些随机剩余垃圾的地址

您需要对由多个线程访问的任何对象的所有权有一些概念,如
a
is here。它可以由名为
pthread\u create
的线程拥有、由新创建的线程拥有或共同拥有。但你必须始终如一。这两个你都没有,为什么

a
是否只属于调用
pthread\u create
的线程?否,因为新创建的线程有一个指向它的指针,并通过该指针访问它。因此,调用
pthread\u create
的线程无法销毁它

a
是否仅由
pthread\u create
创建的线程所有?不,因为它位于调用
pthread\u create
的线程堆栈上,并且在下一个循环出现时将不再存在

a
是否为共同所有?不,因为调用
pthread\u create
的线程可以在新创建的线程访问对象之前销毁该对象

因此,没有一个明智的多线程使用模型会遵循
a
。它坏了


这个问题的一个常见解决方案是为每个线程分配一个新的结构(使用
malloc
new
),填写它,并向线程传递结构的地址。完成后,让线程
释放结构。
(或
删除结构。

谢谢。你给了我洞察力。现在我要试试看!
char *buffer;
int fsize, count;
char **searchword;
int *wordcount;
int *strlength;

typedef struct _params{
int num1;
int num2;
}params;

pthread_mutex_t mutex;

void *childfunc(void *arg)
{

int size, i, j, k, t, start, end, len, flag = -1;

int result;

params *a = (params *)arg;
start = a->num1;
end = a->num2;


while(1){

if(start == 0 || start == fsize)
break;
if(buffer[start]!= ' '  && buffer[start] != '\n' && buffer[start] != '\t')
start++;
else
break;
}

while(1){

if(end == fsize)
break;
if(buffer[end] != ' ' && buffer[end] != '\n' && buffer[end] != '\t')
end++;
else
break;
}

for(i = 0; i < count; i++){

len = strlength[i];
for(j = start; j<(end - len + 1); j++){ 

if(buffer[j] == searchword[i][0]){ 

flag = 0; 
for(k = j +1; k<j + len; k++){
if(buffer[k] != searchword[i][k-j])
{
flag = 1; 
break;

}

}
if(flag == 0){

pthread_mutex_lock(&mutex);
wordcount[i]++;
pthread_mutex_unlock(&mutex);// mutex unlocking
sleep(1);
flag = -1;

}
}

}

}

}

int main(int argc, char **argv){

FILE *fp;
char *inputFile;
pthread_t *tid;
int *status;
int inputNumber, i, j, diff, searchstart, searchend;
int result = 0;

count = argc -3;
inputNumber = atoi(argv[1]);
inputFile = argv[2];

searchword = (char **)malloc(sizeof(char *)*count); 
tid = malloc(sizeof(pthread_t)*inputNumber);
strlength = (int *)malloc(4*count);
status = (int *)malloc(4*inputNumber);
wordcount = (int *)malloc(4*count);

for(i = 0; i < count; i++)
searchword[i] = (char*)malloc(sizeof(char)*(strlen(argv[i+3]) + 1));
for(i = 3; i < argc; i++)
strcpy(searchword[i-3], argv[i]); 
fp = fopen(inputFile, "r"); 
fseek(fp, 0, SEEK_END); 
fsize = ftell(fp); 
rewind(fp); 
buffer = (char *)malloc(1*fsize);

fread(buffer, fsize, 1, fp); 

diff = fsize / inputNumber; 
if(diff == 0)
diff = 1;

for(i = 0; i < count ; i++){
strlength[i] = strlen(searchword[i]);    
wordcount[i] = 0; 
}


for(i = 0; i < inputNumber; i++){

searchstart = 0 + i*diff;
searchend = searchstart + diff; 

if(searchstart > fsize)
searchstart = fsize; 

if(searchend > fsize) 
searchend = fsize;

if( i == inputNumber -1) 
searchend = fsize;
params a;
a.num1 = searchstart;
a.num2 = searchend;

pthread_mutex_init(&mutex, NULL);

result = pthread_create(&tid[i], NULL, childfunc, (void *)&a);

if(result < 0){
perror("pthread_create()");
}

}

//스레드 받는 부분

for(i = 0; i < inputNumber; i++){
result = pthread_join(tid[i], (void **)status);

if(result < 0)
perror("pthread_join()");
}
pthread_mutex_destroy(&mutex); // mutex 해제
for(i = 0; i < count; i++)
printf("%s : %d \n", searchword[i], wordcount[i]);

for(i = 0; i < count; i++) //동적메모리해제
free(searchword[i]);
free(searchword);

free(buffer);
free(tid);
free(strlength);
free(wordcount);
free(status);

fclose(fp);


return 0;
}
params a; // new a for each loop, previous a no longer exists
a.num1 = searchstart;
a.num2 = searchend;

pthread_mutex_init(&mutex, NULL);

result = pthread_create(&tid[i], NULL, childfunc, (void *)&a);

if(result < 0){
perror("pthread_create()");
}

} // a goes out of scope here