문제

현재 ARM 및 PPC 아키텍처에 배치 될 다중 스레드 애플리케이션을 작업하고 있습니다. 팔에 pthread_cancel에 문제가 있습니다.

ARM의 PTHREAD_CANCEL은 PPC와 동일하게 작동하지 않습니다. 스레드가 취소되지만 스레드의 로컬 변수의 소멸자는 팔에 호출되지 않습니다. 또한 PTHREAD_CLEANUP_PUSH를 통해 설치된 취소 정리 핸들러 루틴을 명시 적으로 정의하려고 시도했습니다. 그러나 스레드가 취소 될 때 호출되지 않습니다.

코드는 PPC와 잘 작동합니다. 스레드가 취소되면 로컬 변수의 파괴자가 호출됩니다. 그리고 명시 적으로 정리 핸들러를 정의했을 때 PTHREAD_CANCEL이 호출되면 호출 및 실행되었습니다.

내가 뭔가를 놓치고 있습니까? 아마도 일부 컴파일러 옵션?

  • 프로그래밍 언어 : C ++
  • 컴파일러 : ARM-LINUX-G ++/POWERPC-LINUX-G ++
  • OS : Linux

편집하다:

나는 이것에 비슷한 문제를 발견했다. LIBC 버그.

g ++ 대신 gcc를 사용하고 -fno -exception 컴파일러 옵션을 추가하면 트릭이되었습니다. 그러나 나는이 문제의 배후에있는 것들을 정말로 이해하고 싶습니다. 또한 -fno -exception은 응용 프로그램에서 예외 처리를 수행 할 수 없다는 것을 의미합니다.

감사.

도움이 되었습니까?

해결책

응용 프로그램의 도움없이 스레드 취소는 나쁜 생각입니다. 단지 Google. 스레드가 주기적으로 확인하는 플래그 변수를 설정하여 스레드 자체를 종료하도록 지시하는 것이 훨씬 낫습니다.

실제로 취소는 너무 어렵 기 때문에 최신 C ++ 0X 드래프트에서 생략되었습니다. 검색 할 수 있습니다 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2497.html 취소에 대한 언급은 전혀 없습니다. 제안 된 스레드 클래스의 정의는 다음과 같습니다 (취소 할 수 없음).

class thread
{
public:
    // types:
    class id;
    typedef implementation-defined native_handle_type; // See [thread.native]

    // construct/copy/destroy:
    thread();
    template <class F> explicit thread(F f);
    template <class F, class ...Args> thread(F&& f, Args&&... args);
    ~thread();
    thread(const thread&) = delete;
    thread(thread&&);
    thread& operator=(const thread&) = delete;
    thread& operator=(thread&&);

    // members:
    void swap(thread&&);
    bool joinable() const;
    void join();
    void detach();
    id get_id() const;
    native_handle_type native_handle(); // See [thread.native]

    // static members:
    static unsigned hardware_concurrency();
};
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top