스레드 풀의 함정
2406 단어 스레드 풀
스레드 탱크에 동기화 대기열이 데이터를 저장하고 여러 스레드가 대기열의 데이터를 추출하여 처리한다. 데이터의 유형은 여러 개가 있을 수 있기 때문에 모든 데이터 유형은 하나의 처리 함수에 대응한다. 어떤 데이터의 처리 함수가 스레드를 막는다고 가정하면 비극적이다. 이 저항은 스레드 탱크의 모든 스레드로 번질 수 있다. 마지막에 스레드 탱크의 모든 스레드가 끊어지고 프로그램도 끊어진다.스레드 탱크의 스레드는 데이터를 처리하기 위해 끊임없이 전환되기 때문에, 모든 스레드가 죽을 때까지 스레드가 하나씩 죽는다.
해결 방법:
하나, 한 유형의 데이터, 한 라인 또는 여러 종류의 데이터, 한 라인. 이렇게 하면 어떤 유형의 데이터 처리로 인해 라인이 끊기고 다른 라인은 정상적으로 운행할 수 있으며 프로그램이 끊기지 않는다.
2. 스레드 탱크에 시간 초과 처리를 추가하면 시간 초과 처리가 스레드를 끊지 않습니다.
스레드 탱크를 사용하려면 반드시 스레드 처리 함수가 끊어지지 않도록 보증해야 한다. 그렇지 않으면 프로그램 전체가 끊어질 것이다.스레드 탱크 내부의 스레드 함수는 시간 초과 처리를 필요로 하는데, 간단한 처리 방법은 임시 스레드를 통해 이 함수의 시간 초과 여부를 제어하는 것이다.원래 처리 논리
while (m_running)
{
Task task; m_queue.Take(task); if (task) { task() } } while (m_running) { Task task; m_queue.Take(task); if (task) { boost::thread thd(task); if(thd.timed_join(boost::posix_time::seconds(5)))
{ cout<<" "<<endl;
} else
{
cout<<" "<<endl;
// , , socket
// CloseSocket(),CloseDB()
} } }
시간 초과 처리 시, 노드 함수가 끊어진 자원을 방출해야 한다. 예를 들어 socket을 닫거나 데이터베이스를 닫으면 끊어진 노드가 퇴출될 수 있다.
주의: 여기는 프로그램의 오류 보증일 뿐 근본적인 문제를 해결하지 못합니다. 근본적인 문제를 해결하려면 라인이 끊긴 함수의 버그를 해결해야 합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Android 다중 스레드(3) AsyncTask 소스 분석(Android 7.0)주석 1에서 볼 때 이WorkerRunnable는Callable 인터페이스를 실현하고, 그 call 방법을 실현하였으며, call 방법에서doInBackground (mParams) 를 호출하여 작업을 처리하고 결과...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.