2014-06-12 4 views
0

저는 C++을 처음 접했고 스레드를 실험하고 있습니다. while 루프에서 스레드 안에 스레드를 만들려고합니다. 하지만 나는 그것이 작동하는 것 같지 않습니다. 는 현재 내 코드는 다음과 같습니다 : 내가 읽은해야하는 파일의 목록이 들어있는 파일을 읽을려고while 루프에서 다른 스레드 안에있는 스레드

#include <> 
std::vector<pthread_t> outer_thread, inner_thread; 

    void *inner_thread(void *ptr) 
    { 
     string data1; 
     data1 = *(reinterpret_cast<string*>(ptr)); 
     cout << "inner thread started " << data1; 

/* do something */ 
     cout << "inner thread stopped " << data1; 

pthread_exit(NULL); 
    return 0; 


    } 

    void *outer_thread(void *ptr) 
    { 
cout << "out thread started" << endl; 
//cout << ptr << endl; 
//cout << *(reinterpret_cast<string*>(ptr)) << endl; 
string data; 
data = *(reinterpret_cast<string*>(ptr)); 


     string str3; 
while (getline(data,str3)) 
{ 
     cout << "out thread started" << endl; 


pthread_t in_thread; 
in_vec.push_back(str3); 
       int create_thread2 = pthread_create(&in_thread, NULL, &inner_thread, reinterpret_cast<void*>(&(in_vec.at(j)))); 
       inner_thread.push_back(in_thread); 


     if (create_thread2 != 0) 
     cout << "Error : Thread"; 


     j++; 

     cout << "out thread ends " << j << create_thread2 << endl ; 

    } 
     for (int k = 0; k < j ; k++) 

{ 
pthread_join(inner_thread.at(k),NULL) ; 
} 

pthread_exit(NULL); 
    return 0; 

} 
    int main (int argc, char *argv[]) 
    { 
     int i = 0; 
     while (getline(gin,str)) 
     { 
string str1; 
       pthread_t out_thread; 
       cout << "str1" << str1 << endl; 
now_vec.push_back(str1); 
int create_thread = pthread_create(&out_thread, NULL, &outer_thread, reinterpret_cast<void*>(&(now_vec.at(i)))); 
       outer_thread.push_back(out_thread); 
       if (create_thread != 0) cout << "Error : Thread" ; 

     i++; 
     } 

for (int k = 0 ; k < i; k ++) 
{ 
cout << i << endl; 
//cout << "third thread " << outer_thread.at(1) << endl; 
cout << outer_thread.at(k) << endl; 
cout << "out out out" << endl; 
pthread_join(outer_thread.at(k),NULL) ; 
} 


    } 

. 나는이 모든 파일을 동시에 읽고 싶다. 이러한 모든 파일에는 정보가 들어 있으며 다른 작업을 시작하기위한 또 다른 스레드 세트가 필요합니다. 따라서 이것은 동시에 수행되어야합니다. 그것이 2 개의 스레드 세트를 실행하는 이유입니다. 더 빠르고 간단한 방법이 있다면 알려주세요.

내부 스레드가 완료 될 때까지 기다렸다가 다음 반복으로 시작될 때까지 기다리는 것처럼 보입니다. 내부 스레드가 외부 스레드 내부에서 동시에 실행되기를 원합니다. 이것에 대해 어떻게 알아야할까요?

+0

켭니다. 당신은 가치를 반환하지 않습니다. – chris

+3

당신은 [pthread_join] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_join.html) * 루프 내부에 있습니다. 그래서 기다리고 있습니다. – jsantander

+0

'pthread_t threads [i];'첫 번째 반복에서는 여기에 올바르게 할당하지 않습니다 ('int i = 0;'). –

답변

0

하지 당신이해야 할 노력하고,하지만 난 당신의 코드를 simplying에서 오는 희망하는 많은 구문 오류 중 이런 무엇 무엇인지 :

  1. 메인 스레드가 스레드를 생성합니다 (1) 및 대기 (join)
  2. (1) 스레드가 outer_thread를 실행하고 다른 스레드 (2)를 생성하고 완료 (join) 할 때까지 기다린다.
  3. (2) thread가 inner_thread를 실행하고 finish한다.
  4. (2)가 결합되고 (1) 스레드가 완료 될 수 있습니다.
  5. (1)이 결합되고 주 스레드가 다음 반복으로 이동할 수 있습니다.
  6. 과정이 다시 시작됩니다.

스레드가 다른 완료를 기다리고 있으므로 병렬 실행이 수행되지 않습니다.

작업에 스레드를 두는 것이 속도를 향상시키는 방법이 아니라는 것에 유의하십시오.

스레드의 방법 중 하나

  • 조직을 단순화
  • (당신은 단지 당신이 가진 CPU 리소스 많은 스레드를 사용하여 여러 CPU 자원 ... 그리고이) 당신의 CPU 리소스를 사용하여 더 나은 요청을 스레드로 캡슐화하여 코드를 수정하십시오 (그러나 이런 종류의 트릭 스케일은 매우 나쁩니다).
+0

이 경우 어떻게 병렬 실행을 시작할 수 있습니까? – user3309525

+0

@ user3309525 한 스레드가 다음 스레드를 시작하기 위해 완료 될 때까지 기다리지 마십시오. – jsantander

+0

while 루프 전에 스레드를 선언하는 방법을 잘 모르겠습니다. 얼마나 많은 스레드가 필요할 지 모르겠습니다. – user3309525

2

스레드 조작보기가 잘못되었습니다. 스레드가 다른 스레드 내에서 작동하지 않습니다. 그것들은 같은 프로세스 내에서 독립적 인 실행 스트림이며 이들의 공존은 계층 적이 지 않고 평평합니다.

  • 만들기 스레드가 고가이기 때문에, 생성하고 신속하게 그들을 파괴 방지 :

    몇 가지 간단한 규칙은 여러 스레드로 작업 할 때 따라야합니다. 응용 프로그램을 시작할 때 한 번 스레드를 작성하고 작업이 가능 해지면 작업을 할당하는 것이 가장 좋습니다.

  • 계산 작업을 할 때 CPU에서 동시에 실행할 수있는 것보다 많은 스레드를 생성하지 마십시오. 추가 스레드가 있으면 초과 컨텍스트 전환이 발생하고 응용 프로그램 속도가 느려집니다.
  • 가능한 한 자주 공유 리소스를 사용하지 마십시오. 데이터 구조가 스레드간에 공유되어야하며 잠금없는 구현을 찾으려고 시도해야합니다. 잠금 해제 구현에서 공유 리소스를 사용할 수 없다면 잠금을 사용하여 잠금을 보호하지만 잠금을 잘못 사용하면 응용 프로그램이 교착 상태에 빠지거나 응용 프로그램 성능이 직렬 실행 사례로 저하됩니다 (마치 단 하나의 실이었다).

특정 경우에 여러 파일을 병렬 처리하여 처리 속도를 높이려면 (이러한 스레드가 달성해야하는 유일한 작업이이 파일의 처리라고 가정 할 경우) 가능한 해결책은

  • 나누기에 섹션으로 목록 (당신 CPU의 각 논리 프로세서에 대해 하나의 섹션)을 작동 할 파일 목록에

    1. 읽기 : 같을 것이다.
    2. 파일 목록의 해당 섹션을 통과하는 작업자 스레드 (논리 프로세서 당 하나)를 만듭니다 (스레드를 생성하는 동일한 루프의 스레드와 결합하지 마십시오. 스레드가 실행을 끝내고 응용 프로그램을 종료 할 때까지 차단됩니다). 병렬로 처리하지 않고 연속적으로 실행하는 경우)

    작업자 스레드는 파일 목록을 한 번에 하나씩 읽고 처리 할 수 ​​있습니다.

    제안 된 솔루션과 달리이 파일 당 스레드를 만들지 않습니다. 대신 과도한 컨텍스트 스위칭을 피하면서 CPU에서 병렬로 실행할 수있는만큼의 스레드를 생성합니다.

    위의 원시적 예 : 컴파일러 경고에

    #include <pthread.h> 
    #include <vector> 
    #include <string> 
    
    #define NUM_THREADS 4 
    
    std::vector<std::string> work_pool[NUM_THREADS]; 
    
    void *worker_thread(void *args); 
    
    int main(int argc, char *argv[]) 
    { 
        pthread_t threads[NUM_THREADS]; 
    
        // Read list of files here, distribute them evenly amongst the work_pools 
    
        for (int i = 0; i < NUM_THREADS; i++) { 
         pthread_create(&threads[i], NULL, worker_thread, (void *)i); 
        } 
    
        for (int i = 0; i < NUM_THREADS; i++) { 
         pthread_join(threads[i], NULL); 
        } 
    
        return 0; 
    } 
    
    void *worker_thread(void *args) 
    { 
        const int id = (int)args; 
        std::vector<std::string>::iterator it; 
    
        for (it = work_pool[id].begin(); it != work_pool[id].end(); it++) { 
         // Read file and process it here 
        } 
    
        return NULL; 
    } 
    
  • +0

    귀하의 제안에 따라 스크립트를 수정했습니다.그게 무슨 뜻인지는 모르겠지만 코드에 대한 피드백이 필요합니다. – user3309525

    +0

    스크립트를 수정했지만 값이 모든 곳에서 올바르게 전달되지 않습니다. 문제가 무엇인지 모릅니다. – user3309525

    +0

    이 문제는 필요한 스레드 수를 확신 할 수 없다는 것입니다. NUM_THREADS는 0에서 10 또는 20까지 다양합니다. – user3309525

    관련 문제