이 페이지에서

Qt 모듈의 스레드 지원

스레드와 SQL 모듈

데이터베이스 연결은 이를 생성한 스레드 내에서만 사용해야 합니다. 연결을 다른 스레드로 이동하려면 ` QSqlDatabase::moveToThread()`를 사용할 수 있습니다.

또한, QSqlDrivers에서 사용하는 타사 라이브러리는 멀티스레드 프로그램에서 SQL 모듈을 사용하는 데 추가적인 제한을 부과할 수 있습니다. 자세한 내용은 사용 중인 데이터베이스 클라이언트의 설명서를 참조하십시오.

스레드 내 그리기

QPainter 스레드 내에서 ` QImage`, ` QPrinter`, ` QPicture` 및 (대부분의 플랫폼에서) ` QPixmap ` 렌더링 장치에 그리기 작업을 수행할 수 있습니다. QWidget에 대한 그리기 작업은 지원되지 않습니다. macOS에서는 GUI 스레드 외부에서 출력할 경우 자동 진행률 대화 상자가 표시되지 않습니다.

주어진 시점에 여러 스레드가 동시에 그리기를 수행할 수 있지만, 특정 그리기 장치에는 한 번에 하나의 스레드만 그리기를 수행할 수 있습니다. 즉, 두 스레드가 각각 다른 QImage에 그리기를 수행한다면 동시에 그리기를 수행할 수 있지만, 두 스레드가 동일한 QImage 에 동시에 그리기를 수행할 수는 없습니다.

스레드와 리치 텍스트 처리

QTextDocument, QTextCursor 및 모든 관련 클래스는 재진입 가능합니다.

GUI 스레드에서 생성된 QTextDocument 인스턴스에는 QPixmap 이미지 리소스가 포함될 수 있다는 점에 유의하십시오. QTextDocument::clone()를 사용하여 문서의 복사본을 생성하고, 추가 처리(예: 인쇄)를 위해 해당 복사본을 다른 스레드로 전달하십시오.

스레드와 SVG 모듈

QtSvg 모듈의 QSvgGenerator 및 QSvgRenderer 클래스는 재진입 가능합니다.

스레드와 암시적 공유 클래스

Qt는 QImage 및 QString 를 비롯한 많은 값 클래스에 대해 ‘암시적 공유 (implicit sharing )’라는 최적화 기법을 사용합니다. Qt 4부터 암시적 공유 클래스는 다른 값 클래스와 마찬가지로 스레드 간에 안전하게 복사될 수 있습니다. 이 클래스들은 완전히 재진입 가능합니다. 암시적 공유는 말 그대로 암시적입니다.

많은 사람들은 참조 카운팅이 일반적으로 수행되는 방식 때문에 암시적 공유와 멀티스레딩이 양립할 수 없는 개념이라고 생각합니다. 그러나 Qt는 공유 데이터의 무결성을 보장하기 위해 원자적 참조 카운팅을 사용함으로써, 참조 카운터의 잠재적인 손상을 방지합니다.

단, 원자적 참조 카운팅이 스레드 안전성을 보장하는 것은 아닙니다. 암시적 공유 클래스의 인스턴스를 스레드 간에 공유할 때는 적절한 잠금(locking)을 사용해야 합니다. 이는 공유 여부와 관계없이 모든 재진입 가능 클래스에 적용되는 동일한 요구 사항입니다. 그러나 원자적 참조 카운팅은 암시적 공유 클래스의 자체 로컬 인스턴스를 처리하는 스레드의 안전성을 보장합니다. 명시적인 잠금 없이도 데이터를 전달할 수 있으므로, 스레드 간 데이터 전달에는 시그널과 슬롯을 사용하는 것을 권장합니다.

요약하자면, Qt 4의 암시적 공유 클래스는 실제로 암시적으로 공유됩니다. 멀티스레드 애플리케이션에서도 마치 일반 비공유 재진입 가능 값 기반 클래스인 것처럼 안전하게 사용할 수 있습니다.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.