2017-04-18 1 views
0

문자열을 입력으로하여 멀티 스레딩 프로그램을 만들려고합니다. SDL_CreateThread를 사용하여, 그래서 같은 간단한 구현을 구축하려고 시도 :문자열 매개 변수를 사용하여 SDL_thread 만들기

#include <stdio.h> 
#include <string> 
#include <SDL_thread.h> 

int threadFunction(void* data) { 
    std::string* parameter = static_cast<std::string *>(data); 
    printf("Thread data: %s\n", parameter); 
    return 0; 
} 

int main(int argc, char const *argv[]) { 
    SDL_Thread* threadID = SDL_CreateThread(threadFunction, "test", (void*)"Enter string here"); 
    SDL_DetachThread(threadID); 
    return 0; 
} 

그것은 완벽하게 잘 작동을하지만 난 문자열로 정수를 넣을 때마다 (예 : "123"은 직접적으로 숫자 123) 다음과 구문 분석을 시도 스레드의 정수는 Segmentation Fault: 11입니다. 내 시도는 int i = std::stoi(parameter->c_str());

이유를 설명 할 수 있습니까? void*에서 전송해야합니까?

답변

4

좋아, 먼저 스레드 매개 변수로 (void*)"Enter string here"의 배열에 대한 포인터를 전달하고이 포인터를 static_cast<std::string *>(data) 문자열의 포인터로 캐스트합니다. :: std :: string은 클래스이며 아무런 조건없이 그러한 캐스트를 수행하는 것이 허용됩니다. 또한 암시 적으로 printf("Thread data: %s\n", parameter)하지만 char의 배열을 가리 키기 때문에 문자열을 가리키는 포인터가 문자열 배열이 아닌 포인터를 가리키고 있기 때문에 오류가 발생하지 않습니다.

int threadFunction(void* data) { 
const char * parameter = static_cast< const char * >(data); // correct cast 
+0

고마워요 ... 나는 실수로 'std :: string'을 사용해야하는 문자열이기 때문에 생각했습니다. –

관련 문제