스레드 풀의 함정

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을 닫거나 데이터베이스를 닫으면 끊어진 노드가 퇴출될 수 있다.
주의: 여기는 프로그램의 오류 보증일 뿐 근본적인 문제를 해결하지 못합니다. 근본적인 문제를 해결하려면 라인이 끊긴 함수의 버그를 해결해야 합니다.

좋은 웹페이지 즐겨찾기