2011-08-30 4 views
2

C++에서 QT API를 사용했지만 QT를 사용해 본 경험이 없어도 응답이 효과적 일 수 있다고 상상해보십시오.멀티 스레드 프로그램에서 사용중인 API의 비 재진입 기능

QT는 재진입이 아닌 것으로 지정된 setContent()라는 XML 처리 클래스에 함수를 포함합니다. setContent()를 호출하면 XML 파일을 메모리로 읽어 데이터 구조로 반환합니다.

이해할 수 있듯이 비진복 함수는 다른 파일/개체에서 작동하도록 함수가 호출 되더라도 여러 스레드에서 동시에 호출하는 것이 안전하지 않은 함수입니다.

그래서이 사실을 바탕으로,이 함수를 사용하여 XML 파일을 여는 스레드가 두 개 이상있을 수는 없다는 것을 이해할 수 있습니다. 두 스레드 모두 setContent() 함수에 동시에 액세스 할 수 없으면 .

이 정보가 맞습니까? 그렇다면 직관적으로 멀티 스레딩 문제를 일으킬 수있는 기능처럼 보이지 않으므로 API를 작성하는 것이 좋지 않은 것처럼 보입니다. 또한 뮤텍스는 전혀 제공되지 않습니다 (the API).

내 멀티 스레드 프로그램에서 두 개 이상의 스레드가 다른 XML 파일을 열 때이 함수를 사용하려면 setContent() 함수에 대한 액세스를 처리하는 가장 좋은 방법은 무엇입니까? XML에 액세스 할 모든 파일에 포함 된 헤더 파일에 extern mutex를 만들어야합니까?

답변

1

static QDomImplementation::InvalidDataPolicy invalidDataPolicy 인 것처럼 보입니다. QDom *** 클래스가 사용하는 유일한 정적 데이터입니다.

setContent 그리고 전역 함수는 파싱 할 때 그 값을 사용하며, 다른 스레드가 중간에 변경하면 분명히 어떤 일이 발생할 수 있습니다.

프로그램이 setInvalidDataPolicy()을 호출하지 않으면 다른 스레드에서 XML을 구문 분석해도 안전하다고 가정합니다.

1

이 그래서를 기반으로, 내 이해) (내가 어떻게 든 의 setContent 접근으로부터 보호 이러한 스레드를 모두 하지 않는 한이 기능을 사용하여 XML 파일을 엽니 다 하나 개 이상의 스레드를 가질 수 없을 것입니다 동시에 작동합니다.

나는 맞는 것 같아.

그래서 하나 개 이상의 스레드가 다른 XML 파일을 열 수 어디에 내 멀티 스레드 프로그램에서이 기능을 사용하기 위해,의 setContent() 함수에 대한 액세스를 처리 할 수있는 가장 좋은 방법은 무엇입니까? 내가 XML에 액세스 할 모든 파일 에 포함 된 자체적 인 헤더 파일에 extern mutex를 작성해야합니까?

다시 말해서, 뮤텍스에 관해서 당신과 동의하는 경향이 있습니다. (그런데 Qt는 QMutex을 제공합니다.)하지만 헤더 파일에서 extern 뮤텍스가 무엇을 의미하는지 확신 할 수 없으므로 정확히 하나의 뮤텍스를 인스턴스화하고이 뮤텍스에 대한 포인터를 모든 그것을 필요로하는 쓰레드.