2014-01-20 4 views
1

확장명이 .NEF 인 wile을 처리해야하는 다음 코드가 있습니다.내 스레드 프로그램에 어떤 문제가 있습니까?

#include <iostream> 
#include <regex> 
#include <pthread.h> 
#include <dirent.h> 

using namespace std; 

void *workHorse(void*); 

int main (int argc, char *argv[]){ 
    pthread_t t1; 
    int rc, pos1; 
    DIR *dir; 
    struct dirent *ent; 
    regex e("(.*)(\\.)(NEF|nef)"); 
    if ((dir = opendir (".")) != NULL) { 
     string fn1; 
     while ((ent = readdir (dir))!=NULL){ 
     fn1.assign(ent->d_name); 
     if (regex_match (fn1, e)){ 
      cout<<"F :"<<fn1.c_str()<<" "<<endl; 
      if (rc=pthread_create(&t1, NULL, &workHorse, (void*)&fn1)){ 
       cout<<"Error creating threads "<<rc<<endl; 
       exit(-1); 
      } 
     } 
     } 
    } 
    return 0; 
} 

void *workHorse(void *fileName){ 
    int ret; 
    cout<<"W :"<<((string*)fileName)->c_str()<<endl; 
    pthread_exit(NULL); 
} 

확장명이 .NEF 인 파일이 하나뿐입니다. 내 예상 출력은 -

F :DSC_0838.NEF 
W :DSC_0838.NEF 

그러나, 나는

F :DSC_0838.NEF 
W :RGBbmp.bmp 

RGBbmp.bmp

같은 디렉토리에있는 다른 파일입니다 얻을. 내 코드에 어떤 문제가 있습니까? 예상대로 작동하지 않는 이유는 무엇입니까? 위의 코드를 사용하여 컴파일 된

-

g++ tmp.cpp -pthread --std=c++11 
+0

* fn1' 문자열 개체가 하나뿐입니다 - 포인터가 전달됩니다. 그러나 메인 스레드의'cout'은 부작용 *을 즉시 평가합니다. – user2864740

+1

또한 쓰레드에 안전하지 않은 여러 개의 스레드를 사용하여 cout으로 인쇄합니다. 귀하의 결과가 크게 혼란 스럽거나 혼합 될 수 있습니다. – Paladine

답변

3

을 Fn1의 주소는 메인 스레드와 사용자가 만든 보조 p_thread 사이에 공유됩니다. 새 스레드가 부트 스트랩하는 동안 주 스레드는 'fn1'메모리 주소의 값을 변경하고 보조 스레드는 다른 파일의 이름을 읽습니다 (주 스레드 fn1에 새 값이 있으므로).

보조 스레드에 전달한 문자열의 복사본을 만들거나 읽기/쓰기를 동기화해야 할 필요가 있으므로 이전 방법을 사용하는 것이 좋습니다. 이 라인

: (RC =는 pthread_create (& T1, NULL, & 사역마 (공극 *) &을 Fn1))

당신을 Fn1의 주소를 전달하는 값은 다음의 변경되면 메인 루프를 다른 파일 이름으로 옮기고 트레드가 나타날 때까지는 이제 RGBbmp.bmp가됩니다.

+0

고맙습니다. 이것은 내 첫 번째 스레드 프로그램이며 스레드 안전성을 전혀 생각하지 못했습니다. –

관련 문제