2010-01-30 12 views
1

응용 프로그램에서 스레드를 사용해야하는 경우. 즉, 언제 단일 스레드 응용 프로그램을 다중 스레드 응용 프로그램으로 변환해야합니까? 개발자가되어 응용 프로그램이 원활하게 실행되지 못하는 문제가 있다고 생각합니다. 이 작업은 스레드가 처리 할 수 ​​있습니다. 우리가 GPS 데이터를 계속받는 것처럼 응용 프로그램에서 스레드를 만드는 데는 다른 이유가 더 있다고 생각합니다. 의견을 말하십시오.단일 스레드 - 멀티 스레드 응용 프로그램

감사합니다.

+0

가독성을 높이십시오. 이해하기가 어렵습니다. – oneat

+1

기본적으로 그는 단일 스레드 응용 프로그램을 다중 스레드 응용 프로그램으로 변환 할 때 어떤 인센티브가 필요한지 알고 싶어한다고 생각합니다. 그의 질문의 마지막 문장은 "이해하기 쉬운"것이다. – SyntaxT3rr0r

+1

@oneat, 프로필에 따르면 "독자"는 뉴 델리 출신이므로 영어는 "첫 번째"언어가 아니며, 따라서 완벽한 문법보다 적습니다. 누군가의 모국어가 영어가 아닐 수도 있습니다. =) – Rob

답변

3

이유는 내가 머리 꼭대기에서 생각할 수 있습니다. (더 많은 것이 있다고 확신합니다) :
1. 작업 일괄 처리를 작업자 스레드로 오프로드하여 프로그램이 사용자 입력에 계속 응답 할 수 있습니다. 또는 그 작업에 의존하지 않는 다른 코드를 계속 실행할 수 있습니다.
2. 응답 시간이 가변적이거나 알려지지 않은 서버 및 네트워크 통신과 같은 I/O 처리. 직장의 개별 비 의존적 장치로 다운 작업을 서브 분할 할 데이터
3. 병렬 처리
4. 타이머 관련 작업 즉

그러나 'X가 변경된 경우 매 500ms로 확인'으로 전환 멀티 스레드 또는 동시 프로그래밍은 함정이 없다면 특히 스레드가 공유 데이터에 액세스해야하므로 SO에 관한 질문 수가 약 mutexesthread synchronisation 인 경우!

+0

그래, 그게 내가 찾고 있던 대답은 ... :) – Reader

2

"변환"하는 것은 멀티 코어 머신이 표준이되고 있으며, 오래된 코어가 하나의 코어에서만 작동하기 때문에 성능이 좋지 않은 것을 보는 것은 매우 슬픈 일입니다.

필자는 Mac에서 16 개의 가상 코어가 필요하고 (종종 호출되는) 정렬 알고리즘이 하나의 코어에서만 실행되는 한 부분이 실제로 느린 응용 프로그램을 가지고있었습니다. 나는 코어와 빙고의 수에 맞추기 위해 멀티 쓰레드 분류 알고리즘을 구현했다. 놀랍도록 빠른 속도 향상을 보였다.

이렇게 매우 최적화되지 않은 동작은 CPU 모니터를 사용하여 분명하게 나타납니다.

질문에 대한 답변 하나가 "언제 쓰레드를 사용해야합니까?" 단순히 "하나의 코어에서만 실행되도록함으로써 인위적으로 소프트웨어 속도를 저하시킬 때"입니다.

이 예제에서 정렬 알고리즘의 복잡성은 O (n log n)로 유지되지만 "병렬화 효과"가 놀라운 속도 향상을 제공하기 때문에 매우 흥미 롭습니다.

다른 이유로는 잘 생각한 procuder/consumer 스키마를 사용하여 응용 프로그램을 올바르게 멀티 스레딩하는 것이 어떤 종류의 자원 경합을 줄이는 데 도움이 될 수 있습니다.

1

일반적인 생각은 은 병렬로 수행 할 수있는 작업 (여러 코어를 활용할 때)이 여러 스레드를 사용하는 것이 유리하다는 것입니다. embarrassingly parallel 문제가 있다고 생각하십시오. 여기에 목적은 더 많은 것을 동시에하는 것입니다. Effective Concurrency에 대한 H. Sutter의 기사를 읽으십시오.

종종 사람들은 사용자 인터페이스 응답 성을 스레딩에 연결합니다. 이것은 반드시 필요한 것은 아니며 특정 OS/프레임 워크/API의 기능에 따라 다르지만 일반적인 사용법은 백그라운드 스레드에서 파일 열기/저장과 같은 긴 작업을 수행하여 UI가 해당 작업 기간 동안 고정되지 않도록하는 것입니다.

스레드가있는 또 다른 상황은 이 필요합니다. 내부적으로 스레드를 사용하는 공급 업체 라이브러리 (메시지 제품 등)를 처리 할 때가 있습니다. 스레드는 명시 적으로 처리해야합니다.

멀티 스레딩은 로켓 과학이 아니지만 어렵습니다. 이 같은 경쟁 조건, 교착 상태, 우선 순위 역전메모리 모델 머리에 해협 기초를 얻기 위해 큰 시간을 지불한다.

0

OldEnthusiast는 코어를 활용하면 스레드를 사용하는 것이 좋습니다. 그러나 핵심 하드웨어가 아닌 오래된 하드웨어에서 실행 중이더라도 여전히 스레드가 필요한 이유가있을 수 있습니다. 프로그램이 오랜 시간 작업을하는 동안 사용자가 UI를 계속 제어 할 수 있어야합니다.프로그램은 파일 처리 또는 네트워크에서 무언가를 가져 오는 것과 같은 작업을 스레드로 분할하고 사용자가 프로그램과 상호 작용할 수있게하고 다른 작업을 대기열에 넣을 수 있습니다.

2

스레딩의 아주 좋은 용도 중 하나는 서로 다른 문제 공간을 연결 해제하는 것입니다. 예를 들어, 단일 스레드가 원격 통신, 사용자 상호 작용 및 계산을 수행하는 경우 프로그램이 커지면서 몇 가지 문제가 발생할 수 있습니다. 통신 속도가 느려지거나 프로세서 사이클 소비가 늘어날수록 사용자 환경이 바뀔 수 있습니다.

코드의 통신, 사용자 및 알고리즘 부분 (실시간 시스템을 수행하는 경우 특히 짧은 목록)을 자신의 스레드로 분리하면 코드의 모듈성과 이해 가능성이 높아져서 예기치 않은 결과로 인해 버그가 발생할 가능성이 있으며 실행 우선 순위 및 동기화를 제어 할 수 있습니다.

최근 응용 프로그램에서 날짜 - 시간 관리, 통신, GUI, 주기적 원격 요청, 동작 제어 및 워치 독용 스레드를 사용했습니다.

물론 멀티 스레딩은 경쟁 조건 및 예상되는 시퀀스에서 발생하는 상황과 같은 자체 문제를 가지고 있지만 세마포, 뮤텍스 등으로 관리 할 수 ​​있습니다.

1

병렬 코드 흐름에 대해 요구 사항이있을 때 멀티 스레딩의 주요 용도가 있습니다.

최상의 예 공을 표시하려면 애니메이션을 실행해야하는 의 볼 브레이커 게임을 제공 할 수 있습니다. 사용자가 이동하여 입력 한 내용을 사용하여 배트를 이동시킵니다.

여기서 스레드에서 애니메이션을 실행하고 다른 스레드에서 사용자와 상호 작용합니다. 단일 스레드 응용 프로그램으로 해결할 수없는 문제.

관련 문제