У меня есть эта проблема, которую я изучаю, но я не понимаю одну часть. Сценарий не на английском языке, поэтому перевод будет довольно утомительным, но основная проблема заключается в том, чтобы заставить поток прочитать определенный текстовый файл и найти определенное слово. У каждого файла есть свой поток и все такое. Последние 2 проблемы заключаются в том, чтобы убедиться, что различные вхождения в одном и том же файле печатаются вместе, например:
file1: line 1
file1: line 2
file2: line 1
и так далее. Я мог бы решить эту проблему, используя глобальный массив 2d и создав структуру для передачи потоку его «id» и имени текстового файла, который он должен искать. Я использовал pthread_join
, и это довольно интуитивно понятно. Проблема в следующей задаче, решите ту же задачу, но без pthread_join
и без занятого ожидания, если это возможно. Проблема в том, что если я не использую pthread_join
, я не могу ничего напечатать в функции потока, и я этого не ожидал? Есть ли причина, по которой это происходит?
Это код, который я использовал для решения проблемы с pthread_join
. Без pthread_join
, используя мьютекс и пытаясь напечатать вывод в функции потока, я не получил вывода.
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<errno.h>
#include<fcntl.h>
#include <pthread.h>
#define k 4
#define l 100
int match_line(int fd, char *str);
void *ocorre(void *);
char string[100];
int b[k][l];
int max;
struct args{
char str[256];
int id;
};
int main(int argc, char *argv[]){
int i=0;
int j=0;
max=argc-1;
struct args arg[max];
pthread_t a[max];
strcpy(string,argv[1]); //global
for(i=0;i<max-1;i++){ //criaçao de threads
arg[i].id=i;
strcpy(arg[i].str,argv[i+2]);
pthread_create(&a[i],NULL,ocorre,&arg[i]);
}
for(i=0;i<max-1;i++){ //join
pthread_join(a[i],NULL);
for(j=0;b[i][j]!=0;j++){
printf("%s : %d\n",arg[i].str,b[i][j]);
}
}
}
void *ocorre(void *arg) {
int fd;
int j=0;
struct args func;
func=*(struct args*)arg;
fd=open(func.str,O_RDONLY);
while(1){
b[func.id][j]=match_line(fd,string);
if(b[func.id][j]==0)
break;
j++;
}
return NULL;
}
pthread_join
. - person David Schwartz   schedule 13.04.2017flockfile()
, чтобы обеспечить синхронизацию выходного потока. Поток блокирует выходной поток, записывает и разблокирует. Вы можете использовать мьютексы и условные переменные для каждого файла/потока без использованияpthread_join()
, но не забывайте запускать потоки как отдельные потоки, если вы не собираетесь к ним присоединяться. - person Jonathan Leffler   schedule 13.04.2017pthread_create
, чтобы создать поток как отсоединенный, вместо того, чтобы создавать его как присоединяемый (по умолчанию), а затем отдельно отсоединять. - person bta   schedule 13.04.2017