2016-08-03 5 views
0

안녕하세요 저는 C++에서 멀티 스레딩을 처음 사용합니다. 다른 스레드에서 함수를 실행하기 위해 C++ 11에서 사용할 수있는 스레드 클래스를 사용하고 있지만 어떻게 든 함수에서 가져 오는 출력은 매우 어색합니다. 이는 서로 다른 스레드가 동일한 변수를 동시에 실행하여 충돌을 일으킬 수 있기 때문일 수 있습니다. 올바른 결과를 얻을 수 있도록 코드를 수정해야하는 방법을 제안하십시오. 내가하려는 일의 샘플 코드를 게시하고 있습니다. 이것은 원래 코드가 아니지만 원본 코드가 너무 길기 때문에 원래 코드의 흐름을 보여 주지만 문제는 두 경우 모두 동일합니다.다른 스레드에서 실행되는 함수가 이상한 결과를 출력합니다.

#include<iostream> 
    #include<thread>  

    using namespace std; 

    typedef struct { 
     int thread_id; 
     char *message; 
    }threadData; 

    int display(threadData *tData){ 
     threadData *my_data; 
     my_data = (threadData *) tData; 

     cout << "Thread ID: " << my_data -> thread_id << endl; 
     cout << "Message: " << my_data -> message << endl; 

     return 0; 
    } 

    int main(){ 

     threadData *data; 

     data = (threadData *)malloc(sizeof(threadData)); 
     data->thread_id = 12; 
     data->message = "This is the message"; 
     for (int i = 0; i<10; i++) 
     { 
      std::thread t1(display, data);  
      t1.detach(); 
     } 
     return 0; 
    } 

출력 : 처음 실행되는 guaruntee하지 않는 스레드로

Thread ID: 12 
    Message: This is the messageThread ID: 
    12 
    Message: This is the message 
    Thread ID: 12 
    Message: This is the message 
    Thread ID: 12 
    Message: This is the message 
    Thread ID: 12 
    Message: This is the message 
+1

잠금 및 메모리 모델에 대해 읽고 싶습니다. 진지하게 : 이것은 매우 광범위한 주제입니다. 그리고 당신은 "예를 들어"가면 안됩니다. 그러나 "개념에 의해". 의미 : 해당 주제에 대한 연구를 수행하십시오. 예를 들어 "C++ thread locking example"에 대한 그물 검색. 내 말은 : 예, 사람들이 당신에게 물건을 설명 할 때 좋습니다. 하지만이 자료는 수천 번 기록됩니다. 이 질문을 작성하는 것보다 인터넷을 직접 검색하는 데 ** 적은 시간 **이 걸릴 것입니다. 주의 사항 : 이것은 여전히 ​​유효한 질문이므로 downvote 또는 close 투표는 없지만 여전히 ... – GhostCat

+1

실제로 잠금 및 일반 스레드 개념에 대해 읽으십시오. 또한,'malloc'과'C++ '? 'typedef 구조체'? C++을 약간 새로 꾸밀 수도 있습니다. –

답변

0

, 당신이 공유 리소스에 대한 액세스를 보호 할 필요가 . 가장 쉬운 방법은 뮤텍스를 이용하는 것입니다.

std::mutex g_i_mutex; // protects g_i 

typedef struct { 
    int thread_id; 
    string message; 
}threadData; 

int display(threadData *tData) 
{ 
std::lock_guard<std::mutex> lock(g_i_mutex); 
threadData *my_data; 
my_data = (threadData *) tData; 

cout << "Thread ID: " << my_data -> thread_id << endl; 
cout << "Message: " << my_data -> message << endl; 

return 0; 

}

출력 :

스레드 ID : 12 메시지 : 12 메시지 :이 메시지 스레드 ID이다 : 12 메시지이 메시지 스레드 ID 인 : 메시지입니다. 스레드 ID : 12 메시지 : 이것은 메시지입니다.

스레딩 개념에 대해 좀 더 읽어 보시기 바랍니다. 그 배경 개념은 간단하지 않고 준비된 솔루션을 얻는 것만으로도 결국에는 도움이되지 않습니다.

2

내가 읽은 것은 for 루프가 10 번 실행될 것으로 예상되지만 4 번만 실행 되었기 때문입니다. 주 함수에서 수행 한 모든 스레드가 완료 될 때까지 기다리지 않았기 때문에 다른 프로세스보다 먼저 종료됩니다. 스레드가 실행할 기회가. '주'는 모든 스레드가 자신의 작업을 마칠 때까지 잠시 기다려야합니다.

그리고 모든 스레드가 그냥 읽고 있기 때문에 여기서는 경쟁 조건을 보지 못했습니다. 아무도 threadData에 쓰지 않습니다.

관련 문제