2013-09-05 3 views
0

힙이 블랙리스트에있는 경우 (멀티 스레드 사용) ips 목록을 확인하고 싶습니다.멀티 스레드를 사용하여 파일 읽기

pthread_mutex_t input_queue; 

void * process(void * data) 
{ 
    unsigned long ip = 0xffffffff; 
    char line[20]; 
    while (!feof(INFILE)) 
    { 
     pthread_mutex_lock(&input_queue);//?required 
     if (fgets(line,sizeof(line),INFILE) != NULL) 
     { 
      if (strlen(line) < 8) 
       break; 
      if (line[strlen (line) - 1] == '\n') 
       line[strlen (line) - 1] = '\0'; 
      ip = ntohl((unsigned long)inet_addr(line)); 
     } 
     pthread_mutex_unlock(&input_queue); 
     blacklist(ip); 
    } 
    return NULL; 
} 

//in main() 
    pthread_mutex_init(&input_queue,NULL); 
    for(i = 0 ; i < number_thread; i++) 
    { 
     if(pthread_create(&thread_id[i],NULL,&process,NULL) != 0) 
     { 
      i--; 
      fprintf(stderr,RED "\nError in creating thread\n" NONE); 
     } 
    } 
    for(i = 0 ; i < number_thread; i++) 
     if(pthread_join(thread_id[i],NULL) != 0) 
     { 
      fprintf(stderr,RED "\nError in joining thread\n" NONE); 
     } 

가에 pthread_mutex_lock이 필요하거나는 fgets 스레드 안전 :

그래서, 나는 다음과 같은 코드가? 내 코드에 몇 가지 문제가 있다고 생각합니다.

답변

3

필요하지 않습니다. POSIX는 각 FILE 객체가 스레드로부터 안전함을 보장합니다. http://pubs.opengroup.org/onlinepubs/009695399/functions/flockfile.html 참조 : 그들은 이 (FILE *) 객체의 소유권을 획득하기 위해 내부적으로 flockfile()funlockfile()를 사용 것처럼 (FILE *) 객체가 행동해야 참조하는

모든 기능을.

계산이 많이 필요하지 않으면 10 바이트마다 잠금을 설정하면 실제로는 멀티 스레드를 피하는 것보다 훨씬 느려집니다.

1

C.99는 스레드 인식이 아니므로 이식성은 잠금이 필요합니다. 그러나 C.11 파일 조작 (C.11 § 7.21.2 ¶ 7)에 스레드 안전을 보장한다 :

각 스트림 데이터 레이스를 방지하기 위해 사용되는 관련 로크를 갖는 경우 여러 스레드 실행 접근 복수의 스레드에 의해 수행되는 스트림 동작들 간의 인터리빙을 제한하기 위해서이다. 한 번에 하나의 스레드 만이 잠금을 보유 할 수 있습니다. 잠금은 재진입 성 (reentrant)입니다. 단일 스레드는 주어진 시간에 잠금을 여러 번 보유 할 수 있습니다.

파일의 크기가 크지 않은 경우 전체 파일을 한 번에 읽은 다음 스레드에 대한 입력을 나누는 것이 더 효율적일 수 있습니다. 그러나 필자의 제안으로는 파일이 충분히 커지면 직렬화 된 I/O가 병목 현상을 일으킬 수 있습니다. 이 시점에서 바이너리 파일 형식과 같은 입력에 대한 대체 파일 표현을 고려하고 비동기 입출력을 사용하고 파일의 여러 지점에서 병렬로 읽을 수 있습니다.

관련 문제